(1)new expression :不能被重载,其行为总是一致的。它先调用operator new分配内存,然后调用构造函数初始化那段内存。
new 操作符的执行过程:
1. 调用operator new分配内存 ;
2. 调用构造函数生成类对象;
3. 返回相应指针。
(2)operator new:要实现不同的内存分配行为,应该重载operator new,而不是new。
operator new就像operator + 一样,是可以重载的。如果类中没有重载operator new,那么调用的就是全局的::operator new来完成堆的分配。同理,operator new[]、operator delete、operator delete[]也是可以重载的。
(3)placement new:只是operator new重载的一个版本。它并不分配内存,只是返回指向已经分配好的某段内存的一个指针。因此不能删除它,但需要调用对象的析构函数。
如果你想在已经分配的内存中创建一个对象,使用new时行不通的。也就是说placement new允许你在一个已经分配好的内存中(栈或者堆中)构造一个新的对象。原型中void* p实际上就是指向一个已经分配好的内存缓冲区的的首地址。
- operator new和operator delete不是new expression和delete expression的重载,它 们完全是另外的一个独立的东西,具有不同的语意,这与operator +是对+ expression 的重载不同。
- new expression和delete expression是不能被重载的,可以看出它们与普通的 expression 不同。
operator new其实也是可以直接利用的,譬如当我们只想分配内存,而不愿意进行初始化的 时候,我们就可以直接用operator new 来进行。用法如下:
T* newelements = static_cast<T*>(operator new ( sizeof(T) );