新規配置と削除: 適切なメモリ割り当て解除
「新規配置」演算子の両方を使用してメモリを割り当てる場合 (new (mem) 構文)標準の new 演算子を使用する場合、そのメモリを解放するには正しいメソッドを使用することが重要です。
次のコード スニペットを考えてみましょう。
<code class="cpp">const char* charString = "Hello, World"; void *mem = ::operator new(sizeof(Buffer) + strlen(charString) + 1); Buffer* buf = new(mem) Buffer(strlen(charString));</code>
割り当てられたメモリの割り当てを適切に解除するには、次の呼び出しを行う必要があります。 :
<code class="cpp">buf->~Buffer(); ::operator delete(mem);</code>
これは次の理由によるものです:
間違ったアプローチ:
アプローチ 1:
<code class="cpp">delete (char*)buf;</code>
このアプローチは、バッファを char* ポインターであるかのように削除しようとするため、正しくありません。ただし、メモリは配置 new で割り当てられているため、代わりに演算子 delete を使用する必要があります。
アプローチ 2:
<code class="cpp">delete buf;</code>
このアプローチも失敗するため、正しくありません。 Buffer オブジェクトのデストラクターを手動で呼び出します。その結果、オブジェクトによって取得されたリソースが解放されず、メモリ リークやその他の問題が発生する可能性があります。
以上が質問の形式と内容との関連性を考慮した、いくつかのタイトルのオプションを次に示します。 オプション 1 (問題に焦点を当てる): * Placement New を使用するときに「delete buf」が正しくないのはなぜですか? オプション 2 (の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。