C++ 深刻new

1,C++ new首先做为运算符和关键字使用,相似sizeof,能够认为是编译器内置的,不能改变其行为,例如:函数

A *a=new A;int *i=new int;

对普通类型而言,只是分配空间。而对类类型,不只分配空间,还调用类的构造函数,例如:翻译

Class *pc = new Class;delete pc;

编译器翻译为指针

void *p = operator new(sizeof(Class));
// 对p指向的内存调用Class的构造函数,此处没法用直观的代码展示
Class *pc = static_cast<Class*>(p);
// ...
pc->~Class();
operator delete(pc);

若是类A重载了new成员函数,使用new关键字的时候直接调用类A的new函数。不然,使用全局new,类中new的重载仅仅影响重载类的内存分配策略。code

2,全局new函数,和全局operator+() 同样,只不过是普通的函数,是能够重载的,重载后会影响全部对象的分配策略。对象

::operator new(size_t size) throw(bad_alloc);

使用new关键字的时候,首先调用全局::operator new分配空间大小 ,若是分配失败调用用户指定的失败处理函数,不然抛出bad_alloc。内存

void * operator new(std::size_t size) throw(std::bad_alloc) {
    if (size == 0)
        size = 1;
    void* p;
    while ((p = ::malloc(size)) == 0) {
        std::new_handler nh = std::get_new_handler();
        if (nh)
            nh();
        else
            throw std::bad_alloc();
    }
    return p;
}

3,placement newget

placement new ,便是一个全局 operator new 的重载版本。对象指针指向的空间不限于堆空间,也能够指向栈上,以此来实现本身的内存池。编译器

inline void* operator new  (std::size_t, void* __p) {return __p;}

能够看到, placement new 除了正常的size参数外,还多了一个空指针参数,并且,它也没干什么内存分配的活,而是直接返回了这个指针。使用以下:编译

void *buf =; // 在这里为buf分配内存
Class *pc = new (buf) Class();

4,::operator new []、类的new[]重载和使用与new相似。
相关文章
相关标签/搜索