几年前,之前auto_ptr
,我编写了自己的智能指针类,我们在代码库中广泛使用了它。当然,里面塞满了虫子。
我有完全相同的问题。虽然我无法向您展示我用来识别资源泄漏源的调用站点的实际代码(因为代码不再存在),但我可以告诉您我做了什么。
第一件事是我写了一个#define
宏 >SHUDDER<,类似于我在这里概述的那个,我可以用它来代替new
分配我的对象。宏向智能指针发送附加参数,指示调用站点的文件和行号。智能指针会保留这个。
然后new
,当我说出#defines
打开此功能的神奇咒语时,我用我的宏替换了全局。显然,这应该在所有 Releasse 版本中禁用,并且仅在您实际调试this时在 Debug 版本中使用。
然后我让我的程序运行,直到我想查看所有呼叫站点。我会dump_call_sites()
在那里的智能指针上执行一个方法,它将static
vector
调用站点字符串转储到标准输出。因此发现了问题,我会恢复所有那些神奇的咒语来关闭所有这些 hokus pokus。
这是真正的 hack-n-slash 编码。它远非优雅,它引入了它自己的一系列问题。但随着printf
调试,它也有它的位置。如果您不想或无法加载您的 Rational Purify 或 Bounds Checker 类型的产品,这可以帮助您快速确定泄漏的来源。