ホームページ >バックエンド開発 >C++ >Placement New を使用する場合、「delete」は実際に正しく割り当てを解除しますか?

Placement New を使用する場合、「delete」は実際に正しく割り当てを解除しますか?

Barbara Streisand
Barbara Streisandオリジナル
2024-10-28 12:50:02827ブラウズ

 When Using Placement New, Does `delete` Actually Deallocate Correctly?

Placement New および Delete

C では、演算子のオーバーロードにより、カスタムの new および delete 演算子の使用が可能になります。ただし、そのような演算子で割り当てられたメモリの割り当てを正しく解除する方法という問題が生じます。次のコード スニペットを考えてみましょう。

<code class="cpp">const char* charString = "Hello, World";
void *mem = ::operator new(sizeof(Buffer) + strlen(charString) + 1);
Buffer* buf = new(mem) Buffer(strlen(charString));

delete (char*)buf; // OR delete buf;</code>

メモリ割り当て解除のタスクをオーバーロードされた削除演算子 (ダイレクト メソッド) に委任するのは論理的だと思われます。ただし、このアプローチは正しくありません。

正しい方法

この場合、メモリの割り当てを解除する正しい方法は、オブジェクトのデストラクターを明示的に呼び出し、続いて演算子を呼び出すことです。割り当てられたメモリを解放する削除関数:

<code class="cpp">buf->~Buffer();
::operator delete(mem);</code>

説明

事前に割り当てられたメモリ アドレスを受け取る配置 new 演算子を使用する場合、デフォルトのコンストラクターは次のとおりです。自動的には呼び出されません。したがって、デストラクターを手動で呼び出すことが重要です。また、delete buf を直接呼び出すことも、グローバル演算子の delete を呼び出すだけで、配置の新しい割り当てについては認識しないため、間違っています。

Buf->~Buffer()

配置 new 演算子が使用されるときは常に、後で ::operator delete 関数が呼び出される場合でも、デストラクター呼び出し (buf->~Buffer()) が必要です。

ベスト プラクティス

混乱を避けるため、常に一致する演算子のペアを使用してください。

    ::operator new および ::operator delete
  • new() と delete() (新規/削除の配置)

以上がPlacement New を使用する場合、「delete」は実際に正しく割り当てを解除しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。