web-dev-qa-db-ja.com

ポインタの配列を削除しています

delete[] a、ここでaは動的に割り当てられたポインターの配列であり、配列内の各ポインターに対してdeleteを実行しますか?

ユーザー定義クラスの配列に対してデストラクタを実行すると思いますが、ポインタはどうなっているのでしょうか。

番号、 delete []は配列を削除するために使用されます。配列要素を削除する必要がある場合は、それぞれでdeleteを呼び出す必要があります。

22
juanchopanza

いいえ。生のポインタには、ターゲットの割り当てを解除する方法(または割り当てを解除するかどうか)に関する情報が含まれていないため、ポインタを破棄してもターゲットが削除されることはありません。

これが、動的リソースの管理にこれらを使用してはならない理由です。すべての作業を自分で行う必要があり、エラーが発生しやすくなります。代わりに、 [〜#〜] raii [〜#〜] を使用して、ポインターをコンテナー、スマートポインター、およびリソースを管理し、破棄時に自動的に解放するその他のクラスに置き換える必要があります。動的配列をstd::vector(または、各オブジェクトを個別に割り当てる必要がある場合はstd::vector<std::unique_ptr>)に置き換えると、すべてが自動的に割り当て解除されます。

7
Mike Seymour

いいえ、aが動的に割り当てられた生のポインタの配列である場合、delete[] a;は、生のポインタ配列によって占有されているメモリを削除するだけですが、ポイントされたオブジェクトのデストラクタを呼び出しませんnot

したがって、これらの生のポインタが所有ポインタである場合、リークトロシティがあります: )

STLコンテナクラスとスマートポインタを使用します。例: std::vector<std::unique_ptr<X>>、より現代的で単純なアプローチの場合:このようにして、exception-safetyautomaticの両方を取得しますポインタの配列とポイントされたオブジェクトの両方のdestroyation

3
Mr.C64

delete[]配列の各要素のデストラクタを呼び出します。ポインタは基本型であるため、実際にはデストラクタがないため、何も実行されません。

それがまさにスマートポインタが使用される理由です:delete[]は各要素のデストラクタを呼び出し、スマートポインタのデストラクタはマネージポインタのdeleteを呼び出します。

だから: スマートポインタについて学ぶ そして手でメモリを管理するのをやめなさい。それはより簡単で、エラーが発生しにくく、低レベルではありません。

3
Manu343726

Delete []は、配列内の要素のみを削除します。配列要素が指すメモリは削除しません。配列要素が指すメモリを削除する場合

  1. 各配列要素でdeleteを呼び出して、各メモリを明示的に削除します
  2. 次に、delete []演算子を使用して配列を削除します
1
Able Johnson

いいえ、delete[]new[]によって作成された配列の割り当てを解除するだけです

詳細についてはリファレンスを参照してください。

0
Intrepidd