delete
で作成されたポインタのみを呼び出す必要がありますoperator new
。new
通常によって割り当てられたメモリ位置で配置を使用する場合operator new
は、安全に使用できますdelete
(タイプとポインタが正しく取得されている場合)。ただし、任意のメモリに配置を使用できるnew
ため、通常はそのメモリを別の方法で管理し、オブジェクトのデストラクタを手動で呼び出します。
たとえば、この複雑で通常は不要なシナリオでは、delete
配置を使用したメモリに対して安全ですが、それは以前にnew
割り当てたためです。new
char* mem = new char[sizeof(MyObject)];
MyObject* o = new (mem) MyObject;
// use o
o->~MyObject(); // with placement new you have to call the destructor by yourself
delete[] mem;
ただし、これは違法です:
char mem[16]; // create a buffer on the stack, assume sizeof(MyObject) == 16
MyObject* o = new (mem) MyObject; // use stack memory to hold a MyObject
// note that after placement new is done, o == mem
// pretend for this example that the point brought up by Martin in the comments didn't matter
delete o; // you just deleted memory in the stack! This is very bad
別の見方をすれば、通常のによって以前に割り当てられたメモリの割り当てを解除するdelete
だけnew
です。配置を使用すると、通常によって割り当てられたメモリを使用するnew
必要がないnew
ため、通常によって割り当てられていない可能性があるためnew
、delete
処理できません。