Placement new见ME,p39.
有时有一些分配好的内存,你需要在上面构造对象。有一个特殊版本的operator new,称为placement new。
练习:
#include<iostream> using namespace std; class Base { public: Base(){cout<<"base"<<endl;} ~Base(){cout<<"~base"<<endl;} }; int main() { void* rawMemory = operator new(sizeof(Base));//只分配内存,不调用构造函数。而且operator new返回的是void*型 Base* pbn=new (rawMemory)Base();//placement New.在已经分配好的内存上构造对象。 cout<<rawMemory<<" "<<pbn<<endl; delete pbn; // pbn->~Base(); // operator delete(pbn); getchar(); return 0; }
delete pbn = pbn->~Base() + operator delete(pbn)。
如果rawMemory不是用operator new来分配的,后面就不能调用delete pbn。因为delete operator会调用operator delete()。而operator delete()只能释放operator new()分配的内存。
结果:
相关:
ME,p39.