新しい配置: メモリの割り当てを解除するために「delete」を使用できないのはなぜですか?

Mary-Kate Olsen
リリース: 2024-10-26 13:50:02
オリジナル
366 人が閲覧しました

 Placement New: Why Can't We Use `delete` to Deallocate Memory?

Placement New の適切なメモリ管理

Placement New を利用する場合、デストラクタを手動で呼び出して、割り当てられたメモリを解放するのはプログラマの責任になります。 。これは、通常両方のタスクを処理する削除演算子のデフォルトの動作とは異なります。

Why Not Delete?

提供されたコード内:

char* pMemory = new char[sizeof(MyClass)];
MyClass* pMyClass = new(pMemory) MyClass();
ログイン後にコピー

メモリは、MyClass オブジェクトに対応するサイズの文字配列に対して new[] を使用して手動で割り当てられます。次に、このメモリ内にオブジェクトを構築するために new の配置が使用されます。

メモリを手動で割り当てるために演算子 new[] が使用されているため、ここで delete を使用するのは正しくありません。 delete は、演算子 new を使用して割り当てられたメモリを対象としていますが、ここでは当てはまりません。

デストラクタの責任

配置 new が使用されたため、呼び出すのはプログラマの責任です。オブジェクトを解放するためのデストラクター。ただし、これにより、割り当てられたメモリが自動的に解放されるわけではありません。メモリ リークを防ぐには、デストラクタの呼び出し後にメモリを明示的に解放する必要があります。

内部バッファを使用した Placement New

Placement New は内部バッファでも使用できます演算子 new で割り当てられなかったもの。このような場合、予期しない動作やメモリ破損が発生する可能性があるため、演算子 delete を呼び出すべきではありません。

例:

struct buffer_struct {
    std::aligned_storage_t<sizeof(MyClass), alignof(MyClass)> buffer;
};

MyClass* pMyClass = new (&a.buffer) MyClass(); //created inside buffer_struct a
ログイン後にコピー

この場合、buffer_struct は、 MyClass オブジェクトですが、オブジェクトの構築と破棄は、それぞれ new 配置とデストラクターを使用して独立して処理されます。

以上が新しい配置: メモリの割り当てを解除するために「delete」を使用できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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