2017-07-25 23 views
0

我已经得到了下面的代码,我认为它基于Finding Memory Leaks Using the CRT Library,应该打印出内存泄漏的行号。CRT不打印内存泄漏的行号

#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。

+0

查看https://stackoverflow.com/q/3202520/4009370 –

回答

2

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 

然后用DBG_NEW更换new在你的代码。我测试了它,它可以正确地与你的代码一起工作。


实际上,在代码中newDBG_NEW更换到处是太繁琐的任务,所以可能你可以使用这个宏:

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

我测试过这个方法,它也能工作。

+0

不错..但是他们的报价已经过时了,我们可以重载新的https://blogs.msdn.microsoft.com/calvin_hsia/2009/01/ 19 /过载的操作员新到检测存储器-泄漏/ – Swift

0

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

“这些技术使用标准的CRT malloc函数分配内存的工作。如果你的程序中使用C++新 运营商,但是,你需要重新定义新的,如果你想看到的 文件和行分配内存内存泄漏报告中的数字“。

结果你会有新的操作符定义的行。你可以使用新的可以接受额外的参数,其中一些可以被默认为macrodefinitions价值的伎俩,这样像__LINE____FILE__

1

检查出答案here。您希望使用超载的new运算符以及解决方案中指定的附加参数来获取该信息。

在这种情况下,您的线路

int* q = new int; 

改变

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

,你应该看到的泄漏。