这是我在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++;
}
是否还有内存泄漏?
答案 0 :(得分:3)
是的。如果您不使用智能指针,或者每delete/delete[]
没有new/new[]
,那么您就会泄漏。如果丢失了已分配资源的句柄,则会泄漏(就像您在代码中所做的那样)。原始内存丢失,因为您不再有指针。
答案 1 :(得分:1)
是的,只要程序中没有指针就会记住动态分配的内存地址,就会发生内存泄漏。 (当然,你也不会在任何地方删除内存。)
答案 2 :(得分:0)
是的,您正在泄漏使用new bool[x][y]
分配的原始数组。
可能会有进一步的泄漏。特别是,没有匹配的释放的p = newArray()
看起来很可疑。
答案 3 :(得分: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
每行中的数组仍会泄露
答案 4 :(得分: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指向上一个new bool *[row]
并且newArray
调用new []来分配内存但是调用delete p
,那么它是未定义的行为。你应该致电delete [] p;
。
如果newArray
调用new来分配内存,while循环释放99个内存块,在while循环之后,你仍然需要调用delete p;
记住new / delete,new [] / delete []必须在程序中成对调用,否则会有内存泄漏;指针被覆盖会导致内存泄漏。