まず第一に、delete
割り当てられたものに対して使用するnew[]
と、C++ 標準に従って未定義の動作になります。
Visual C++ 7 では、このようなペアリングは 2 つの結果のいずれかにつながる可能性があります。
new[] された型に自明なコンストラクタとデストラクタがある場合、VC++ はそのブロックnew
の代わりに単純にnew[]
使用しdelete
、そのブロックに対して使用すると正常に動作します- new
「メモリの割り当て」をdelete
呼び出すだけで、「メモリの解放」を呼び出すだけです。
new[] された型に自明でないコンストラクタまたはデストラクタがある場合、上記のトリックは実行できません。VC++7 は正確に正しい数のデストラクタを呼び出す必要があります。そのため、配列の先頭size_t
に要素数を格納します。によって返されるアドレスはnew[]
、ブロックの先頭ではなく、最初の要素を指すようになりました。したがって、delete
使用されている場合、最初の要素のデストラクタのみが呼び出され、「メモリの割り当て」によって返されたアドレスとは異なるアドレスで「メモリの解放」が呼び出されます。腐敗。
しかし、あちこちで、delete
afterを使用new[]
するとメモリ リークが発生するという誤ったステートメントを読むことができます。デストラクタが最初の要素に対してのみ呼び出され、おそらく呼び出されなかったデストラクタがヒープに割り当てられたサブオブジェクトを解放しなかったという事実よりも、ヒープ破損のサイズが重要であると思います。
delete
afterを使用new[]
すると、一部の C++ 実装でメモリ リークが発生する可能性があります。