在没有 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】:

唯一的解决方案是自己重写内存分配运算符(newdelete);这些运算符可以将任何内存分配和释放记录到某种日志中,因此您稍后将分析此日志。您可以在此处查看详细信息:Overriding memory allocation method standard libraries use? 但是,这会严重影响速度。 我不确定是否也可以覆盖 freemalloc 函数。您可以使用#define 替换您自己代码中的标准freemalloc,但我不确定您的库依赖项是否可行,因此您的内存分配/释放日志可能会丢失由库依赖项分配的数据。当然,您可以使用自己的内存管理函数重新构建所有库。

【讨论】:

【参考方案2】:

我曾尝试使用 MFC 内存泄漏工具,但它们只能在 Debug 中使用。我曾尝试使用各种工具应用程序,例如deleaker,但价格昂贵。 GitHub 上也有免费工具,但我尝试过的工具已经过时(代码未维护),这需要花费大量时间来配置和设置,而且不值得。

信不信由你,我发现的最好的“工具”是通过迭代编译实现程序组件隔离。只需浏览您的代码,然后从大到小禁用/注释掉代码。换句话说,您注释掉所有代码,没有泄漏等。重新编译并让泄漏转储告诉您是否存在泄漏。你可以这样做,直到错误的代码跳出来。它出奇地有效。有时最简单的解决方案是最好的。

我假设您有一种在发布模式下检测泄漏的方法,因此这种方法也适用于这种情况。我不记得 Release MFC 是否有泄漏转储。也许其他人会不自觉地知道这一点。

【讨论】:

以上是关于在没有 3rd 方工具/项目的 MFC C++ 版本中查找内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章

MFC DLL的GUI工具?

MFC 和 /clr C++ 项目中的库

c++ win32 嵌入式 3rd 方应用程序

在子项目(框架项目)中使用 3rd 方 pod

我安装vs2017时安装的c++没安mfc请问怎么单独添加这个组件

将 3rd 方依赖项直接保存到 Flutter 项目