【问题标题】:Allocating memory to a pointer, pointing another pointer to the same and deleting the second将内存分配给一个指针,将另一个指针指向同一个指针并删除第二个
【发布时间】:2014-05-16 19:00:49
【问题描述】:

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

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;

}

我正在使用指针 A 创建一个指针,但使用指针 B 进行释放。指针B 指向与指针A 相同的位置。

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

谢谢

【问题讨论】:

  • 这和你想象的完全一样。但你不应该在意。使用向量或 unique_ptr 或 shared_ptr 并停止考虑指针。
  • 删除由另一个指针分配的内存完全没问题,这就是你在这里所做的。
  • 我建议学习语言基础知识以避免用完全没有意义的东西混淆你的代码。 if(pointerA == NULL) pointerA = NULL; 完全等同于 pointerA = NULL;。同样,NULLdelete 之前的检查是多余的,delete 保证不会对空指针执行任何操作。特别是因为你一直在访问pointerB后面的内存之前你问它是否是NULL;如果它有任何机会成为NULL,那么您已经触发了未定义的行为。

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    是的,使用第二个指针释放内存非常好。你可以通过运行类似的东西来测试这样的东西

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-21
        • 1970-01-01
        • 1970-01-01
        • 2011-03-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多