【发布时间】:2014-07-04 06:27:59
【问题描述】:
我已经覆盖了全局 new/delete 以捕获内存泄漏。当进程退出时,我需要调用assertNoMemoryLeak来断言new分配的所有内存都已释放。
但似乎我不能让assertNoMemoryLeak 成为我的进程中调用的最后一个函数,因为某些全局变量析构函数将是最后一个。
atexit不起作用,原因如下。 AFAIK,当调用构造函数时,由 gcc 生成的全局析构函数将被推送到atexit列表,而且我也无法在启动期间让我的 push 'assertNoMemoryLeak' sn-p 在此之前运行,所以我的assertNoMemoryLeak仍然不会运行作为最后一个函数。另一种解决方法是将
new/delete信息写入文件,然后在进程退出后分析文件(使用脚本)。我不想这样做,因为为每个开发人员自动这样做很复杂。
那么有什么方法可以让assertNoMemoryLeak 成为最后一个调用的函数?
【问题讨论】:
-
我已经删除了 C++ 标签,因为这个问题显然与 C 无关。
-
不是答案,但为什么不使用 Valgrind 来代替detect memory leaks?
-
如果你只有一个翻译单元,你可以创建一个在所有其他全局对象之前构造的全局对象,并让它在构造函数中调用
atexit(),在这种情况下,标准保证在所有全局对象被销毁之前,不会调用注册函数。但是,如果有多个翻译单元,您就不太走运了。 -
但是,如果您使用的是 GCC,则可以使用
init_priorityattribute 强制您的atexit-registering 对象首先初始化,但 requires linker support 因此可能不适用于 android。 -
@T.C.:“让它在构造函数中调用
atexit()”——或者更简单地说,在析构函数中完成工作。
标签: c++ memory-leaks