12

私が行った場合

struct MyStruct { ~MyStruct() { } };

void *buffer = operator new(1024);
MyStruct *p = new(buffer) MyStruct();
// ...
delete p;     //    <---------- is this okay?

と同様に両方の呼び出しを処理することがdelete保証されていますか?~MyStruct() operator delete

4

3 に答える 3

12

【訂正】一概にOKというわけではなく、一般的にdeleteは平易なnew表現で得られたものしかできません。それ以外の場合は、解放関数が割り当て関数と一致することを保証するのはあなた次第です(元の名前がグローバル名前空間にある::delete p;と仮定すると、を使用する方が安全な一般的な解決策になります)。operator new特に、問題のクラス (またはその派生クラスの 1 つ) がオーバーロードoperator newされている場合は注意が必要です。

を作成するためにplacement-new式を使用して*pおり、「placement-delete式」などがないため、オブジェクトを手動で破棄してからメモリを解放する必要があります。

p->~MyStruct();

operator delete(buffer);
于 2013-05-23T23:59:29.210 に答える
0

いいえ、通常は 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)
于 2013-05-25T01:21:03.410 に答える