ホームページ >バックエンド開発 >C++ >C で Placement New で割り当てられたメモリの割り当てを適切に解除する方法

C で Placement New で割り当てられたメモリの割り当てを適切に解除する方法

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-10-30 18:24:03741ブラウズ

How to Properly Deallocate Memory Allocated with Placement New in C  ?

placement new と delete Conundrum

C では、placement new 演算子を使用してメモリを割り当てるときに、適切な割り当て解除方法に関してジレンマが発生します。その記憶。考えられる 2 つの解決策を検討してみましょう:

解決策 1:

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

この解決策は、文字ポインタとして割り当てられたメモリを削除しようとします。ただし、このアプローチは、オブジェクトのデストラクターを適切に処理したり、生のメモリの割り当てを解除したりしないため、正しくありません。

解決策 2:

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

この解決策は、次のことも試みます。割り当てられたメモリを削除しますが、Buffer* ポインターで削除演算子を直接呼び出します。これは、通常の new 演算子を使用してメモリが割り当てられた場合に機能します。ただし、新しい配置が使用されているため、このアプローチも正しくありません。

正しい解決策:

割り当てられたメモリを解放する正しい方法は次のとおりです:

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

このソリューションは、Buffer オブジェクトのデストラクター (buf->~Buffer()) を明示的に呼び出し、演算子削除関数 (::operator delete(mem)) を使用して生のメモリの割り当てを解除します。

ここでの重要な違いは、placement new を使用する場合、演算子の削除関数を直接呼び出して raw メモリを解放する必要があることです。配置 new 演算子から取得したポインターを削除しようとすると、デストラクターが適切に呼び出されないか、メモリ全体の割り当てが解除されません。

以上がC で Placement New で割り当てられたメモリの割り当てを適切に解除する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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