-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++;
}

此代码中是否存在内存泄漏?我应该添加“删除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 each 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++;
}

如果 p 指向 previousnew bool *[row]newArray调用 new [] 来分配内存但你调用delete p,这是未定义的行为。你应该打电话delete [] p;

如果newArray调用new分配内存,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 回答