如何检查内存的释放

时间:2010-11-10 10:21:36

标签: c++ memory-management

如何检查指针指向的内存是否已成功解除分配?

7 个答案:

答案 0 :(得分:12)

用几句话说:你做不到。

查看Valgrind之类的工具,以帮助您调试内存泄漏问题。

你应该考虑的其他一些事情:

  • 使用智能指针,以便您没有考虑内存管理,
  • 释放后将指针设置为0,以便进一步delete无效,
  • 使用标准类(vector,...)而不是滚动自己的
  • 最后,不要使用指针(实际上你几乎可以)

答案 1 :(得分:5)

抱歉,非常简短的回答“你不能”

答案 2 :(得分:2)

使用IBM rational purify工具检查内存的正确释放。

答案 3 :(得分:2)

定义成功!定义解除分配!

取消分配内存(无论是空闲还是删除)后,不得再次使用该指针。所有其他假设都无关紧要。

毕竟,您调用C / C ++运行时来释放内存,但C / C ++运行时也调用操作系统的函数来释放页面。您甚至可以在C / C ++运行时之上安装自定义内存分配器,例如:使用缓存来实现更快的内存分配算法。

所有这些层都可以为自己保留释放的内存(因为碎片或仅仅因为它们喜欢将它保留给自己)或者可能告诉底层将其解除分配。任何事情都可能发生,只是不要再使用那个指针了。

答案 4 :(得分:1)

  1. 一些正在进行静态代码分析的工具可以指出有关内存释放的一些问题。
  2. 使用valgrind检查是否有内存泄漏
  3. 避免使用原始指针 - 使用智能指针

答案 5 :(得分:1)

异常处理。即尝试/捕获块。

答案 6 :(得分:0)

在C ++中,您可以放心地假设释放永远不会失败。析构函数不能抛出异常,保留的实际内存永远不会被释放,所以考虑到这两点,什么都不会出错。

但是,如果删除已删除的指针,程序可能会崩溃。这不是解除分配本身的问题 - 原始delete成功运行。如果程序的内存管理尝试删除两次指针,那么这是一个问题,但现代STL和std::vectorstd::unique_ptr等智能指针很少需要...