delete[] a
、ここでa
は動的に割り当てられたポインターの配列であり、配列内の各ポインターに対してdelete
を実行しますか?
ユーザー定義クラスの配列に対してデストラクタを実行すると思いますが、ポインタはどうなっているのでしょうか。
番号、 delete []
は配列を削除するために使用されます。配列要素を削除する必要がある場合は、それぞれでdelete
を呼び出す必要があります。
いいえ。生のポインタには、ターゲットの割り当てを解除する方法(または割り当てを解除するかどうか)に関する情報が含まれていないため、ポインタを破棄してもターゲットが削除されることはありません。
これが、動的リソースの管理にこれらを使用してはならない理由です。すべての作業を自分で行う必要があり、エラーが発生しやすくなります。代わりに、 [〜#〜] raii [〜#〜] を使用して、ポインターをコンテナー、スマートポインター、およびリソースを管理し、破棄時に自動的に解放するその他のクラスに置き換える必要があります。動的配列をstd::vector
(または、各オブジェクトを個別に割り当てる必要がある場合はstd::vector<std::unique_ptr>
)に置き換えると、すべてが自動的に割り当て解除されます。
いいえ、a
が動的に割り当てられた生のポインタの配列である場合、delete[] a;
は、生のポインタ配列によって占有されているメモリを削除するだけですが、ポイントされたオブジェクトのデストラクタを呼び出しませんnot。
したがって、これらの生のポインタが所有ポインタである場合、リークトロシティがあります: )
STLコンテナクラスとスマートポインタを使用します。例: std::vector<std::unique_ptr<X>>
、より現代的で単純なアプローチの場合:このようにして、exception-safetyとautomaticの両方を取得しますポインタの配列とポイントされたオブジェクトの両方のdestroyation。
delete[]
は配列の各要素のデストラクタを呼び出します。ポインタは基本型であるため、実際にはデストラクタがないため、何も実行されません。
それがまさにスマートポインタが使用される理由です:delete[]
は各要素のデストラクタを呼び出し、スマートポインタのデストラクタはマネージポインタのdelete
を呼び出します。
だから: スマートポインタについて学ぶ そして手でメモリを管理するのをやめなさい。それはより簡単で、エラーが発生しにくく、低レベルではありません。
Delete []は、配列内の要素のみを削除します。配列要素が指すメモリは削除しません。配列要素が指すメモリを削除する場合
いいえ、delete[]
はnew[]
によって作成された配列の割り当てを解除するだけです