这段代码中是否有内存泄漏?

时间:2013-01-30 20:25:41

标签: c++ memory-leaks

这是我在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++;
}

是否还有内存泄漏?

5 个答案:

答案 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 []必须在程序中成对调用,否则会有内存泄漏;指针被覆盖会导致内存泄漏。