CRT不打印内存泄漏的行号

时间:2017-07-25 13:26:20

标签: c++ memory-leaks crt

我已经得到了下面的代码,我认为它基于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.

根据微软的文档,我希望看到打印出泄漏内存的行,但我没有。

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

3 个答案:

答案 0 :(得分:4)

来自MSDN topic

  

这些技术适用于使用标准CRT分配的内存   malloc功能。如果你的程序使用C ++ 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

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

答案 1 :(得分:1)

查看答案here。您希望将重载的new运算符与解决方案中指定的其他参数一起使用,以获取该信息。

在这种情况下,请更改您的行

int* q = new int;

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

你应该看到漏洞。

答案 2 :(得分:0)

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

  

&#34;这些技术适用于使用标准CRT分配的内存   malloc功能。如果你的程序使用C ++ new分配内存   但是,如果您想查看,则需要重新定义新的运算符   内存泄漏报告中的文件和行号。&#34;

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