2011-09-13 13 views
1

私はComparable * array(クラスのテンプレート内)と呼ばれる他のオブジェクトへのポインタの配列を持っています。delete []ポインタへのポインタによって割り当てられたメモリを解放します

削除では、ポインタによって参照されるメモリが削除され、delete []は配列内の各ポインタに割り当てられたメモリの割り当てを解除することを理解しています。

私の質問は、他のオブジェクトへのポインタを含む配列がある場合、配列内の各ポインタと配列自体によって参照されるメモリをどのように割り当てを解除するのですか?

+3

-1のコードを投稿していないために。コードは、*仮定*をすることなく理解することが簡単に*できます。 – Nawaz

+6

+1投稿コードはしばしば良いアイデアですが、多くの開発者はプログラムだけでなくプレーンテキストを読むことを学ぶ必要があります。この場合、プレーンテキストは十分に自明である。 –

+0

[関連する回答](関連リンク:http://stackoverflow.com/questions/4260464/does-stdlistremove-method-call-destructor-of-each-removed-element/4261074#4261074)と[関連FAQ](http:// – fredoverflow

答えて

8

他のオブジェクトへのポインタを含む配列を持っている場合、配列内の各ポインタで参照されるメモリと配列自体の割り当てを解除するにはどうすればよいですか?

あなただけの説明方法:)ループ配列を通してすべてのオブジェクトを削除してから、アレイを削除するには:

for (int i = 0; i < n; ++i) 
    delete array[i]; 
delete[] array; 
+0

+1であり、配列へのポインタ配列の場合、ループ削除は 'delete []'でなければならないことに注意してください。つまり、 'new type [n]'には 'delete []'が必要です。いい答え。 – WhozCraig

5

delete []は、そのようなデストラクターが存在する場合、配列内のすべてのオブジェクトのデストラクターを呼び出します。ポインタ配列の場合、delete []はすべてのポインタを解放しません。これは、ポインタがデストラクタなしのプレーンタイプであるためです。コード内のすべてのポインタを削除する必要があります。

+4

私は額に「ポインタにはデストラクタがありません」と刺青されています。 – fredoverflow

1

配列インデックスによって参照される場所の割り当てを解除するには、配列をループする必要があります。ループの後の最後に配列自体の割り当てを解除する必要があります。

注:動的new[]

0

ありませんを使用して割り当てられていると仮定すると、それはしていません。

delete[]は、ポインタの配列ではなく、new[]を使用して割り当てられたオブジェクトの配列を削除します。

+0

'オブジェクトの配列'?私は* delete []と言うと、ポインタが指すメモリを、新しい[] *を使って割り当てます。 – Nawaz

+0

@Nawaz:間違っています。メモリを解放するだけでなく、 'delete []'もオブジェクトデストラクタを呼び出します。 –

+0

@Nawaz:変数と配列要素はC++のオブジェクトです。配列そのものは: – fredoverflow

関連する問題