ホームページ > バックエンド開発 > C++ > `delete ptr` と `delete[] ptr`: なぜ一方は安全で、もう一方はメモリ リークとなるのでしょうか?

`delete ptr` と `delete[] ptr`: なぜ一方は安全で、もう一方はメモリ リークとなるのでしょうか?

DDD
リリース: 2025-01-03 08:15:40
オリジナル
124 人が閲覧しました

`delete ptr` vs. `delete[] ptr`: Why is One Safe and the Other a Memory Leak?

delete を使用した配列の削除は delete[] と同等ですか?

動的配列を扱う場合、削除と削除の違いを理解することが重要ですdelete で個々の要素を削除し、配列全体を削除するにはdelete[].

ptr を削除すると未定義の動作が発生する理由

提供されたコード内:

IP_ADAPTER_INFO *ptr = new IP_ADAPTER_INFO[100];
ログイン後にコピー

ptr は 100 の配列を指しますIP_ADAPTER_INFO 構造体。 delete ptr を使用してポインターを削除することは、配列の最初の要素を削除することと同じです。ただし、残りの 99 要素は割り当てられたままになります。これにより、メモリ リークが発生する可能性があります。

逆アセンブリ コード分析

delete ptr と delete []ptr 用に Visual Studio 2005 によって生成された逆アセンブリ コードは、違いを明確に示しています。

  • delete ptr: ptr が指すメモリのみを解放します (最初の要素)。
  • delete []ptr: 演算子 delete[] を呼び出し、配列全体の割り当てを正しく解除します。

結論

未定義の動作を回避し、メモリ リークを防止します。new で動的に割り当てられた配列の割り当てを解除するには、常に delete []ptr を使用します。一部のコンパイラは delete ptr を適切に処理する可能性がありますが、これは信頼性が低いため、避けるべきです。

以上が`delete ptr` と `delete[] ptr`: なぜ一方は安全で、もう一方はメモリ リークとなるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート