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相似。