3

重複の可能性:
new[] と delete を組み合わせると、メモリ リークのみが発生する可能性があります。
削除と削除[]

C/C++ の学習を始めたばかりで、delete を使用して単一のオブジェクトを削除し、delete [] を配列に使用するように言われました。

次に、この質問をするこのWebサイトを見つけました

このコードに何か問題がありますか?

T *p = new T[10];
delete p;

注: 誤った回答: 「いいえ、すべて正しい」、「配列の最初の要素のみが削除されます」、「配列全体が削除されますが、最初の要素のデストラクタのみが呼び出されます」。

そのコード ブロックで何が起こるのかという疑問が生じます。「配列の最初の要素だけが削除される」と論理的に考えていたでしょうが、そうではないようです。

4

1 に答える 1

4
  • 削除:これにより、削除が実行されるポインタによって現在割り当てられているメモリが解放されます。最初の変数が指すメモリのみを削除します。

  • delete []:これにより、アレイ全体に割り当てられたメモリが解放されます。配列はいくつかの変数で構成されます。deleteは最初の変数にのみ割り当てられたメモリを解放しますが、delete[]はすべてを実行します。

これを考える良い方法は、delete []をループとして、deleteを命令として考えることです。ここで、配列はループされ、deleteは配列内の各変数で個別に呼び出されます。これは実際にはどのように機能するかではありませんが(実際の動作はもう少し複雑です)、差分を理解するための良い方法です。

ポインタを含むオブジェクトの配列の場合など、最初の要素のみでデストラクタを呼び出してもすべてのメモリが解放されない場合があるため、デストラクタはすべてのオブジェクトで呼び出されます。

于 2012-07-03T03:55:49.463 に答える