ホームページ >バックエンド開発 >C++ >新しい配置: メモリの割り当てを解除するために「delete」を使用できないのはなぜですか?

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

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-10-26 13:50:02438ブラウズ

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

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