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