私が行った場合
struct MyStruct { ~MyStruct() { } };
void *buffer = operator new(1024);
MyStruct *p = new(buffer) MyStruct();
// ...
delete p; // <---------- is this okay?
と同様に両方の呼び出しを処理することがdelete
保証されていますか?~MyStruct()
operator delete
私が行った場合
struct MyStruct { ~MyStruct() { } };
void *buffer = operator new(1024);
MyStruct *p = new(buffer) MyStruct();
// ...
delete p; // <---------- is this okay?
と同様に両方の呼び出しを処理することがdelete
保証されていますか?~MyStruct()
operator delete
【訂正】一概にOKというわけではなく、一般的にdelete
は平易なnew
表現で得られたものしかできません。それ以外の場合は、解放関数が割り当て関数と一致することを保証するのはあなた次第です(元の名前がグローバル名前空間にある::delete p;
と仮定すると、を使用する方が安全な一般的な解決策になります)。operator new
特に、問題のクラス (またはその派生クラスの 1 つ) がオーバーロードoperator new
されている場合は注意が必要です。
を作成するためにplacement-new式を使用して*p
おり、「placement-delete式」などがないため、オブジェクトを手動で破棄してからメモリを解放する必要があります。
p->~MyStruct();
operator delete(buffer);
いいえ、通常は delete を呼び出すべきではありません (演算子 delete がオーバーリードされている場合など、場合によっては問題ない場合があります)。
char *buffer = new char[1024];
MyStruct *p = new(buffer) MyStruct(); //placement new "i'm just calling constructor"
p->~MyStruct(); //destroy the object.
//delete p; // WHAT? even if you override operator delete it may be opaque to reader.
delete [] buffer; // THIS DELETE IS OK (if you have first destroyed MyStruct)