【问题标题】:MSVS 2010 C: memory detection working as expectedMSVS 2010 C:内存检测按预期工作
【发布时间】:2012-05-30 23:47:08
【问题描述】:

我正在 MSVS 2010 中开发一个 C 项目(这意味着我使用的是 malloc、calloc 和 free,而不是 C++ new 和 delete 运算符)。我需要找到内存泄漏(s?),所以我按照http://msdn.microsoft.com/en-us/library/x98tx3cf.aspx 上的步骤让程序在运行结束时转储内存状态。

我包含这样的库:

#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>

我还指定每个出口都应显示调试信息,如下所示:

_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );

但我的调试输出如下所示:

Detected memory leaks!
Dumping objects ->
{80181} normal block at 0x016B1D38, 12 bytes long.
 Data: <  7   7 8 7 > 0C D5 37 00 14 A9 37 00 38 99 37 00 
{80168} normal block at 0x016ACC20, 16 bytes long.
 Data: <  7 H 7 X 7 \ 7 > A8 FB 37 00 48 E9 37 00 58 C2 37 00 5C AC 37 00 
...

根据文章,我应该得到文件名和行号输出,指示泄漏内存的分配位置。为什么没有发生这种情况,我该如何解决?

【问题讨论】:

  • VS 是否有调试版本和发布版本的开关?如果是这样,这是调试版本还是发布版本?
  • 确保在没有事先 #define 的情况下没有其他任何内容首先包含这些文件...
  • 为了强化 Jon Cage 所说的,请注意预编译的标头。您可能需要全部重建或使用编译器选项而不是在文件中定义 _CRT_MAP_ALLOC。这将确保它在每个编译单元中都有定义。
  • 它无法向您显示 __FILE__ 已卸载代码的信息。通常是 DLL。或者编译时没有#include crtdbg.h 的代码。块数太高,crtBreakAlloc 的胜算不大,但你可以试试。
  • 阿德里安,发表您的评论作为答案!确保我的所有文件都有定义并包含解决了我的问题。

标签: c visual-studio memory-leaks


【解决方案1】:

Adrian McCarthy 评论说我应该确保 _CRT_MAP_ALLOC 定义存在于每个编译单元中。虽然我不知道如何将其定义为编译器选项,但我确实创建了一个稀疏头文件,我确保包含每个编译文件。这使得调试功能按预期工作。

【讨论】:

    猜你喜欢
    • 2015-03-09
    • 2018-01-06
    • 1970-01-01
    • 1970-01-01
    • 2020-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多