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的重载仅仅影响重载类的内存分配策略。
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 new
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类似。