我们编写了一个堆分析器(供参考lib_debug
),它覆盖free
和malloc
(和其他),主要用于监视我们的应用程序中的错误,例如内存泄漏,这些应用程序部署在运行 Linux 的 PPC 系统上。lib_debug
被编译为共享库,LD_PRELOAD
在需要时加载。
到目前为止,此调试器运行良好;每当malloc
被调用时,都会在堆栈上创建一个内存监视器单例,当此单例在退出时超出范围时,它会报告任何未释放的内存。
但是,我们的一个应用程序现在std::vector
在全局范围内分配 a。看起来这个全局vector
是在我们的堆分析器之前创建的,最重要的是之后被销毁。因此,一旦main
我们在 this 中插入任何东西vector
,lib_debug
就会认为我们在关机时有内存泄漏。
为了说明,这就是我认为的事件顺序:
LD_PRELOAD
lib_debug
从;加载符号std::vector
在全局范围内的堆栈上创建;lib_debug
初始化发生 -malloc
已在某处调用,这会导致在堆栈上创建实际的堆分析器单例;- 输入
main
; std::vector::push_back()
发生,在堆上分配内存;main
退出;- 堆分析器单
lib_debug
例超出范围,它看到vector
没有释放其内存 - 报告错误; vector
超出全局范围,释放其内存;- 程序终止。
因此,有什么方法可以保证我们的LD_PRELOADed
单例总是最后被删除,从而捕获free
我们应用程序中出现的每一个单例?