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

Allocating memory to a pointer, pointing another pointer to the same and deleting the second

本文关键字:指针 另一个 同一个 第二个 删除 一个 分配 内存      更新时间:2023-10-16

这样的代码会做正确的内存释放吗?

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相同的位置。

我认为它应该正确地释放,但我想确保。有没有一种方法可以有效地测试它?也许创建一个巨大的数组然后检查内存使用情况??

谢谢

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

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

是的,使用第二个指针释放内存是完全可以的。你可以通过运行

来测试
$ valgrind --log-file=/tmp/memcheck.log --tool=memcheck 
           --leak-check=full --show-reachable=yes --num-callers=20 ./your_tool

$ cat /tmp/memcheck.log

如果你试图删除一些你没有分配的东西,你会看到错误。

答案是"通常"。有两件事我要提醒你。确保在使用"new"时也使用"delete",或者使用malloc()时一定要使用free()。运行时库可以使用不同的实现,其中尝试将"new"answers"free()"或"malloc()"answers"delete"结合起来可能会导致泄漏。

这也可能是一个问题,如果你正在处理两个单独链接的库,比如你可能会发现一个。dll和一个。exe,或者两个。dll。在"new"期间分配内存的运行时将在该模块的表中分配内存,但如果删除发生在不同的模块中,"delete"将不会指向相同的内存分配表。

一般来说,我强烈建议遵循内存的"分配器"与内存的"释放器"相同的模式。参考RAII获得最佳实践