【问题标题】:CRT Doesn't print line number of memory leakCRT 不打印内存泄漏的行号
【发布时间】:2017-07-25 13:26:19
【问题描述】:

我有下面的代码,我认为,基于Finding Memory Leaks Using the CRT Library,应该打印出内存泄漏的行号。

#include "stdafx.h"
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#include <iostream>


void derp()
{
    int* q = new int;

}

int main()
{
    _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
    derp();
    return 0;
}

当我运行它时,我得到以下信息:

Detected memory leaks!
Dumping objects ->
{75} normal block at 0x0067E930, 4 bytes long.
 Data: <    > CD CD CD CD 
Object dump complete.

根据 Microsoft 的文档,我希望看到分配泄漏内存的行的打印输出,但我没有。

我做错了什么?我正在使用 VS2015。

【问题讨论】:

标签: c++ memory-leaks crt


【解决方案1】:

来自MSDN topic:

这些技术适用于使用标准 CRT 分配的内存 malloc 函数。如果您的程序使用 C++ new 分配内存 运算符,但是,您可能只能看到文件和行号 全局运算符 new 的实现调用 _malloc_dbg 在 内存泄漏报告。因为该行为不是很有用,您可以 更改它以报告使用宏进行分配的行 看起来像这样:

#ifdef _DEBUG
    #define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__ )
    // Replace _NORMAL_BLOCK with _CLIENT_BLOCK if you want the
    // allocations to be of _CLIENT_BLOCK type
#else
    #define DBG_NEW new
#endif

然后将代码中的new 替换为DBG_NEW。我对其进行了测试,它可以与您的代码一起正常工作。


实际上,将代码中的 new 替换为 DBG_NEW 实在是太繁琐了,所以你可以使用这个宏:

#ifdef _DEBUG
     #define new new( _NORMAL_BLOCK , __FILE__ , __LINE__ )
#else
     #define new new
#endif

我测试了这个方法,它也有效。

【讨论】:

【解决方案2】:

查看答案here。您想使用重载的new 运算符和解决方案中指定的附加参数以获得该信息。

在这种情况下,换行

int* q = new int;

到

int* q = new (_NORMAL_BLOCK, __FILE__, __LINE__) int;

你应该会看到泄漏。

【讨论】:

    【解决方案3】:

    它应该已经在某个地方得到了回答。

    “这些技术适用于使用标准 CRT 分配的内存 malloc 函数。如果您的程序使用 C++ new 分配内存 运算符,但是,如果您想查看 内存泄漏报告中的文件和行号。”

    结果,您将获得新的运算符定义行。您可以使用 new 可以接受额外参数的技巧,其中一些可以默认为宏定义的值,例如 __LINE__ 和 __FILE__

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-12
      • 1970-01-01
      • 2023-03-15
      相关资源
      最近更新 更多