像这样的代码会进行适当的内存释放吗?
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相同的位置。
我认为它应该正确解除分配,但我想确定。有没有办法可以有效地测试它?也许创建一个庞大的数组,然后检查内存使用情况???
由于
答案 0 :(得分:0)
是的,您的代码示例将正确释放已分配的所有内存。
如果您要在pointerA
设置为NULL
之前在行上设置断点并比较pointerA
和pointerB
指向的内存地址,您会看到他们指向内存中的相同位置。因此,使用哪个变量来删除内存并不重要,因为在任何一种情况下都会删除内存中的相同位置。
答案 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。