我已覆盖全局new/delete
以捕获内存泄漏。当进程退出时,我需要调用assertNoMemoryLeak
来声明已释放的所有已分配的内存。
但似乎我不能让assertNoMemoryLeak
成为我进程中调用的最后一个函数,因为一些全局变量析构函数将是最后一个。
atexit
不起作用。当调用构造函数时,由gcc生成的全局析构函数AFAIK将被推送到atexit
列表,并且在启动期间我也无法使我的推送'assertNoMemoryLeak'代码段在此之前运行,因此我的assertNoMemoryLeak
仍然会不能作为最后一个功能运行。
另一种解决方法是将new/delete
信息写入文件,然后在流程退出后,分析文件(使用脚本)。我不想这样做,因为为每个开发人员自动执行它很复杂。
那么任何方法都可以使assertNoMemoryLeak
成为最后一个函数吗?
答案 0 :(得分:0)
如果查找和管理所有全局静态对象是切实可行的,那么您可以创建一个全局静态对象,其作用是以所需顺序构造和销毁所有其他全局对象。如果你无法控制所有这些,或者他们在不同的图书馆中位于太多不同的地方,这将是不切实际的。
您可以通过将所有全局静态对象更改为指针,或者使它们成为一个主对象的成员,或者在没有全局对象的情况下重写代码来实现此目的。关键是要消除任何你没有控制的启动和关闭的东西,然后在你控制的这个全局对象的析构函数中的适当时间运行断言检查。