-2

これは C++ での私のコードです:

bool** p = new bool *[row];
for(int i=0; i<row; ++i) field[i] = new bool[column];
i=0;
while(i<100){
    p = newArray();
    i++;
}

このコードにメモリリークはありますか? 「delete p;」を追加する必要があります。whileループで?


コードを変更すると:

p = new bool *[row];
for(int i=0; i<row; ++i) field[i] = new bool[column];
i=0;
while(i<100){
    delete p;
    p = newArray();
    i++;
}

まだメモリリークがありますか?

4

5 に答える 5

3

はいあります。スマート ポインターを使用しない場合、またはdelete/delete[]for everyがないnew/new[]場合は、リークしています。割り当てられたリソースのハンドルを失った場合は、リークしています (コードで行っているように)。元のメモリへのポインターがなくなったため、元のメモリは失われます。

于 2013-01-30T20:29:30.973 に答える
1

はい、動的に割り当てられたメモリのアドレスを記憶するポインタがプログラムに残っていないとすぐに、メモリリークが発生します。(そしてもちろん、どこのメモリも削除しません。)

于 2013-01-30T20:27:58.187 に答える
0
while(i<100){
    p = newArray();
    i++;
}

ポインタ p は毎回上書きされるため、古典的なメモリリークです。

p = new bool *[row];
for(int i=0; i<row; ++i) field[i] = new bool[column];
i=0;
while(i<100){
   delete p;
   p = newArray();
   i++;
}

new bool *[row]p が previousを指し、newArraynew [] を呼び出してメモリを割り当てたが、 を呼び出した場合delete p、それは未定義の動作です。に電話する必要がありますdelete [] p;

メモリを割り当てるために new を呼び出す場合newArray、while ループは 99 個のメモリ ブロックを解放します。while ループの後、引き続き呼び出す必要があります。delete p;

new/delete を覚えておいてください。new []/delete[] は、プログラム内でペアで呼び出す必要があります。そうしないと、メモリ リークが発生します。ポインターが上書きされると、メモリ リークが発生します。

于 2013-01-30T21:43:26.440 に答える
0

はい、を使用して割り当てられた元の配列をリークしていnew bool[x][y]ます。

さらに漏れる可能性があります。特に、p = newArray()一致する割り当て解除がないと疑わしいように見えます。

于 2013-01-30T20:28:04.483 に答える
0

あなたは間違いなくメモリをリークしています。(プログラムフローの意味がわかったので、自由に修正しました)。

field = new bool *[row];  // <- array created and assigned to "field".
for(int i=0; i<row; ++i) field[i] = new bool[column];
i=0;
while(i<100){
    field = newArray();  // <- the previously-created array is leaked here, as well as
    i++;                 // any new arrays created by previous iterations of "newArray()"
}

newArray()が新しい割り当てを返すと仮定するとdelete[] field、下のループではfield正しく解放されますが、の各行の配列fieldは依然としてリークされます。

于 2013-01-30T20:29:13.523 に答える