C++ 中placement new 操作符使用方法
C++中placementnew操作符使用方法
placementnew操作符能够在分配内存时指定内存位置。下面的程序使用了placementnew操作符和常规new操作符给对象分配内存。
//placenew.cpp--new,placementnew,nodelete #include#include #include usingnamespacestd; constintBUF=512; classJustTesting { private: stringwords; intnumber; public: JustTesting(conststring&s="JustTesting",intn=0) { words=s;number=n;cout< Show(); cout< Show(); JustTesting*pc3,*pc4; pc3=new(buffer)JustTesting("badIdea",6); pc4=newJustTesting("Heap2",10); cout<<"Memorycontents:\n"; cout< Show(); cout< Show(); deletepc2;//freeheap1 deletepc4;//freeheap2 delete[]buffer;//freebuffer cout<<"Done\n"; return0; }
执行结果:
[root@localhost桌面]#./new JustTestingconstructed heap1constructed Memoryblockaddress: buffer:0x936a008heap:0x936a248 Memorycontents: 0x936a008:JustTesting,0 0x936a248:heap1,20 badIdeaconstructed Heap2constructed Memorycontents: 0x936a008:badIdea,6 0x936a290:Heap2,10 heap1destroyed Heap2destroyed Done
上面的程序使用placementnew操作时存在两个问题。首先,在创建第二个对象时,placementnew操作符使用一个新对象来覆盖用于第一个对象的内存单元。显然,如果类动态地为其成员分配内存,这将引发问题。
其次,将delete用于pc2和pc4时,将自动调用为pc2和pc4指向的对象调用析构函数;然而,将delete[]用于buffer时,不会为使用布局new操作符创建的对象调用析构函数。
为确定两个单元不重叠,可以这样做:
pc1=new(buffer)JustTesting; pc3=new(buffer+sizeof(JustTesting))JustTesting("BetterIdea",6);
其中指针pc3相对于pc1的偏移量为JustTesting对象的大小
第二个教训是,如果使用placementnew操作符来为对象分配内存,必须确保其析构函数被调用,但如何确保呢?
例如,在堆中创建的对象,可以这样做:
deletepc2;
然而,对于使用placementnew操作符创建的对象,不能像下面一样调用delete
deletepc1;//NO!!!
原因在于delete可与常规new操作符配合使用,但不能与placementnew操作符配合使用。
那么我们要显示调用析构函数,必须指定要销毁的对象:
pc3->~JustTesting(); //destroyobjectpointedtobypc3
intmain(void) { char*buffer=newchar[BUF];//getablockofmemory JustTesting*pc1,*pc2; pc1=new(buffer)JustTesting;//placeobjectinbuffer pc2=newJustTesting("Heap1",20);//placeobjectonheap cout<<"Memoryblockaddresses:/n"<<"buffer:" <<(void*)buffer<<"heap:"<Show(); cout< Show(); JustTesting*pc3,*pc4; //fixplacementnewlocation pc3=new(buffer+sizeof(JustTesting))JustTesting("betterIdea",6); pc4=newJustTesting("Heap2",10); cout<<"Memorycontents:"; cout< Show(); cout< Show(); deletepc2;//freeheap1 deletepc4;//freeheap2 //explicitlydestroyplacementnewobject pc3->~JustTesting();//destroyobjectpointedtobypc3 pc1->~JustTesting();//destroyobjectpointedtobypc1 delete[]buffer;//freebuffer cout<<"Done/n"; return0; }
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!