在没有 3rd 方工具/项目的 MFC C++ 版本中查找内存泄漏
Posted
技术标签:
【中文标题】在没有 3rd 方工具/项目的 MFC C++ 版本中查找内存泄漏【英文标题】:Finding memory leaks in MFC C++ release build without 3rd party tools/projects 【发布时间】:2014-12-05 08:44:42 【问题描述】:我有一个简单的问题: 如何跟踪 VS 2010 MFC C++ 项目中的内存泄漏?
对于调试版本,有here 描述的可能性。
在不使用 3rd 方工具/项目的情况下发布构建的解决方案是什么?
【问题讨论】:
【参考方案1】:唯一的解决方案是自己重写内存分配运算符(new
和delete
);这些运算符可以将任何内存分配和释放记录到某种日志中,因此您稍后将分析此日志。您可以在此处查看详细信息:Overriding memory allocation method standard libraries use?
但是,这会严重影响速度。
我不确定是否也可以覆盖 free
和 malloc
函数。您可以使用#define
替换您自己代码中的标准free
和malloc
,但我不确定您的库依赖项是否可行,因此您的内存分配/释放日志可能会丢失由库依赖项分配的数据。当然,您可以使用自己的内存管理函数重新构建所有库。
【讨论】:
【参考方案2】:我曾尝试使用 MFC 内存泄漏工具,但它们只能在 Debug 中使用。我曾尝试使用各种工具应用程序,例如deleaker,但价格昂贵。 GitHub 上也有免费工具,但我尝试过的工具已经过时(代码未维护),这需要花费大量时间来配置和设置,而且不值得。
信不信由你,我发现的最好的“工具”是通过迭代编译实现程序组件隔离。只需浏览您的代码,然后从大到小禁用/注释掉代码。换句话说,您注释掉所有代码,没有泄漏等。重新编译并让泄漏转储告诉您是否存在泄漏。你可以这样做,直到错误的代码跳出来。它出奇地有效。有时最简单的解决方案是最好的。
我假设您有一种在发布模式下检测泄漏的方法,因此这种方法也适用于这种情况。我不记得 Release MFC 是否有泄漏转储。也许其他人会不自觉地知道这一点。
【讨论】:
以上是关于在没有 3rd 方工具/项目的 MFC C++ 版本中查找内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章