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