3

ポインターの配列があります ( を呼び出して作成しましたnew ptr*[size])。これらのポインターはすべて、ヒープにも配置されたオブジェクトを指しています。

配列とすべての新しい ptr を削除する適切な方法は何ですか?

これは私が今していることです:

for (int i = 0; i < size; i++) delete array[i];
delete[] array; // Not sure since this double deletes array[0]

これは私がすべきだと思うことをしますか?

ありがとう

4

4 に答える 4

12

で割り当てられたすべてのポインタnewは、対応する を取得しdeleteます。で割り当てられたすべてのポインタnew []は、対応する を取得しdelete []ます。それは本当にあなたが知る必要があるすべてです. もちろん、動的に割り当てられたポインターを含む動的に割り当てられた配列がある場合、割り当て解除は逆の順序で発生する必要があります。

したがって、正しい慣用句は次のようになります...

int main()
{
    int **container = new int*[n];
    for(int i = 0; i < n; ++i)
        container[i] = new int[size];

    // ... and to deallocate...
    for(int i = 0; i < n; ++i)
        delete [] container[i];

    delete [] container;
}

そしてもちろん、「それをやめる」と言い、std::arrayorを使用することをお勧めしますstd::vector(テンプレートの種類は になりますunique_ptr<int>)。

于 2012-12-18T23:42:37.317 に答える
2

はい、それはあなたがそうすべきだと思うことをします。new要素ごとに行ったので、要素ごとに行う必要がありdeleteます。そして、new[]配列全体に対して行ったので、配列全体が必要ですdelete[]

@djechlinがコメントで正しく言っているように、続行するのに十分な情報はありませんが、以前のコードは次のようなものであると推測しています:

int** array = new int*[5];
for (int i = 0; i < 5; i++) {
  array[i] = new int;
}

array は実際には配列型ではないことに注意してください。これは「int へのポインターへのポインター」であり、それが指すポインターの配列は で割り当てられましたnew[]。それがあなたがそれをする必要がある理由ですdelete[]

于 2012-12-18T23:38:34.207 に答える
1

はい。最初に、配列内の各ポインターが指すオブジェクトを解放する必要があり、次に配列自体を解放する必要があります。その順番で。順序を逆にすると、オブジェクトへの参照がなくなり、大量のメモリ リークが発生します。

于 2012-12-18T23:44:34.960 に答える
0

はい、最初に配列の要素が指す各オブジェクトを削除してから、ポインターの配列自体を削除します。メモリ管理を確認したい場合は、valgrindなどのツールを使用できます。ほとんどのエラーを見つけることができます。

于 2012-12-18T23:42:15.417 に答える