質問の形式と内容との関連性を考慮した、いくつかのタイトルのオプションを次に示します。 オプション 1 (問題に焦点を当てる): * Placement New を使用するときに「delete buf」が正しくないのはなぜですか? オプション 2 (

Patricia Arquette
リリース: 2024-10-26 21:59:03
オリジナル
479 人が閲覧しました

Here are a few title options, keeping in mind the question format and relevance to the content:

Option 1 (Focus on the problem):

* Why is `delete buf` Incorrect When Using Placement New?

Option 2 (Focus on the solution):

* How Do You Properly Dealloca

新規配置と削除: 適切なメモリ割り当て解除

「新規配置」演算子の両方を使用してメモリを割り当てる場合 (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>
ログイン後にコピー

これは次の理由によるものです:

  • デストラクターの呼び出し: buf->~Buffer() は Buffer オブジェクトのデストラクターを明示的に呼び出します。これは、オブジェクトによって保持されているリソースを解放するために必要です。
  • 「配置削除」関数の呼び出し: ::operator delete(mem) は、配置 new 演算子 (new) によって割り当てられたメモリを解放します。 (mem))。 「placement new」演算子を使用する場合は、「placement delete」関数も使用してメモリを解放する必要があることに注意してください。

間違ったアプローチ:

アプローチ 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!