【发布时间】:2016-07-05 16:40:26
【问题描述】:
可以在 C/C++ 编译器中构建堆内存泄漏检测吗?例如,在最简单的形式中,在语义分析期间,它会简单地计算分配的内存段(new/malloc 或其他)和每个内存段的delete/free 调用。然后给出一个关于它的编译时警告。
【问题讨论】:
-
IIRC 有一些库可以这样做,
malloc()/free()是大多数 ABI 库中的弱绑定函数,因此可以将它们替换为您自己的版本,或者来自另一个库的版本。 -
您有一些静态分析工具,例如
splint可以这样做...但有些情况下您只能(轻松)确定运行时的内存泄漏(在这种情况下,您可能想查valgrind) -
C++ 中的完美垃圾回收(=泄漏检测)相当于“停机问题”,因此一般无法解决。也就是说,有一些规则需要遵守,有一些你应该检查的可检测热点。如果是新代码,请尝试仅使用托管 ptrs,并且永远不要有没有
weak_ptr的循环。如果是旧代码,请配置文件。如果你对代码有写访问权,你可能会做一些有趣的事情,比如在构造函数中将实例注册到全局数组并在析构函数中删除。在许多情况下,一个额外的基类就足够了。 -
根据标题,我预计您会说您运行
gcc到valgrind并发现内存泄漏或其他问题
标签: c++ c compiler-construction