将内存分配给指针,指向另一个指针并删除第二个指针

时间:2014-05-16 19:00:50

标签: c++ pointers memory-management dynamic-arrays

像这样的代码会进行适当的内存释放吗?

int main(){
int *pointerA, *pointerB;

pointerA = new int[15]();
for (int i=0; i<15; i++)
    pointerA[i] = i*2;


pointerB = pointerA;


if (pointerA != NULL)
      pointerA = NULL;

// Some operation here ...
for (int i=0; i<15; i++)
    std::cout << i << " : " << pointerB[i] << std::endl;

if (pointerB != NULL)
    delete [] pointerB;
pointerB = NULL;


return 0;

}

我使用pointerA创建指针但使用pointerB重新分配。 pointerB指向与pointerA相同的位置。

我认为它应该正确解除分配,但我想确定。有没有办法可以有效地测试它?也许创建一个庞大的数组,然后检查内存使用情况???

由于

3 个答案:

答案 0 :(得分:0)

是的,您的代码示例将正确释放已分配的所有内存。

如果您要在pointerA设置为NULL之前在行上设置断点并比较pointerApointerB指向的内存地址,您会看到他们指向内存中的相同位置。因此,使用哪个变量来删除内存并不重要,因为在任何一种情况下都会删除内存中的相同位置。

答案 1 :(得分:0)

是的,使用第二个指针释放内存非常好。您可以通过运行

之类的东西来测试这样的事情
$ valgrind --log-file=/tmp/memcheck.log --tool=memcheck \
           --leak-check=full --show-reachable=yes --num-callers=20 ./your_tool


$ cat /tmp/memcheck.log

如果您尝试删除未分配的内容,则会看到错误。

答案 2 :(得分:-1)

答案是“通常”。有两件事我要提醒你。如果你使用“new”,你也使用“delete”,或者如果你使用malloc(),请确保使用free()。运行时库可以使用不同的实现,其中尝试组合“new”和“free()”或“malloc()”和“delete”可能会导致泄漏。

如果您正在处理两个单独链接的库,这也可能是一个问题,例如您可能会找到.DLL和.EXE,或两个.DLL。在“new”期间分配内存的运行时将在该模块的表中分配内存,但如果删除发生在另一个模块中,则“delete”将不会指向相同的内存分配表。

一般来说,我强烈建议遵循内存“分配器”的模式与内存的“解除分配器”相同。有关最佳做法,请参阅RAII