在没有第三方工具/项目的情况下,在 MFC C++发布版本中查找内存泄漏
Finding memory leaks in MFC C++ release build without 3rd party tools/projects
我有一个简单的问题:如何跟踪 VS 2010 MFC C++项目中的内存泄漏?
对于调试版本,存在此处描述的可能性。
无需使用第三方工具/项目的发布构建解决方案是什么?
唯一的解决方案是自己覆盖内存分配运算符(new
和delete
(;这些运算符可能会将任何内存分配和释放记录到某种日志中,因此您稍后会分析此日志。您可以在此处查看详细信息:覆盖标准库使用的内存分配方法?但是,这将严重影响速度。我不确定是否可以覆盖free
和malloc
函数。您可以使用#define
替换标准free
和malloc
您自己的代码,但我不确定您的库依赖项是否可能,因此您的内存分配/释放日志可能会丢失由库依赖项分配的数据。当然,您可以使用自己的内存管理功能重建所有库。
我尝试使用 MFC 内存泄漏工具,但它们仅适用于调试。我尝试使用各种工具应用程序,例如deleaker,但它很昂贵。GitHub上也有免费工具,但我尝试过的工具已经过时(代码未维护(,这花费了大量时间来配置和设置,而且不值得。
信不信由你,我找到的最好的"工具"是通过迭代编译来隔离程序组件。只需遍历代码,然后禁用/注释掉从大到小的代码。换句话说,您注释掉所有代码,没有泄漏等。重新编译并让泄漏转储告诉您是否存在泄漏。您可以这样做,直到错误代码跳出来。它的效果出奇地好。有时最简单的解决方案是最好的。
我假设您有一种方法可以在发布模式下检测泄漏,因此这种方法也可以用于此。我不记得发布MFC是否有泄漏转储。也许其他人知道这一点。
相关文章:
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 导入库可以跨dll版本工作吗
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 在clang++预处理器中确定gcc工具链版本
- 码头化的C++应用程序是否向后兼容早期的内核版本
- 不同的Visual Studio版本中缺少.dll
- 用符号版本替换对函数的所有调用
- luaL_dofile在已知良好的字节码上失败,可以使用未编译的版本
- 正在解码MSVC 32位版本的程序集(作业).没有手术做什么
- 我需要分发哪些版本的可再分发文件
- CV_OCL_RUN宏如何在OpenCV(版本3.4.5)的goodFeaturesToTrack实现中工作?
- 在运行时读取 libstdc++ 版本
- 如何声明一个可以在整个程序中使用的全局 2d 3d 4d .. 数组(堆版本)变量?
- FindPackageHandleStandardArgs.cmake:137 的 CMake 错误(消息):找不到 Boost (缺少:正则表达式)(找到合适的版本"1.72.0",
- Vulkan SDK 版本 1.1.85.0 在 Kubuntu 18.10 上链接
- 如何正确实现与基类不同的版本?
- 从预处理器获取 Windows 版本(C++ Win32)
- 表达式 SFINAE:如何根据类型是否包含具有一个或多个参数的函数来选择模板版本
- 如何在C++中将 Python 字符串转换为其转义版本?
- 在一个解决方案中针对第三方静态库 (Creo) 的不同版本(版本)进行构建