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

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

DDD
DDDオリジナル
2025-01-03 08:15:40133ブラウズ

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

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