CRT不打印内存泄漏的行号

4
我有下面的代码,根据使用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。


请参见 https://dev59.com/bnA75IYBdhLWcg3wm6Yj。 - Chris Sprague
3个回答

6
MSDN主题中得知:
这些技术适用于使用标准CRT malloc函数分配的内存。但是,如果您的程序使用C ++ new运算符分配内存,则在内存泄漏报告中可能只会看到全局operator 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

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

不错..但他们的提议已经过时了,我们可以重载新的https://blogs.msdn.microsoft.com/calvin_hsia/2009/01/19/overload-operator-new-to-detect-memory-leaks/ - Swift - Friday Pie

2

请看这里的答案。为了获得那些信息,您需要使用重载的 new 操作符和该解决方案中指定的附加参数。

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

int* q = new int;

为了

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

你应该能看到泄漏。


0

这个问题应该已经有人回答过了。

“这些技术适用于使用标准CRT malloc函数分配的内存。然而,如果您的程序使用C++ new运算符分配内存,则需要重新定义new,如果要在内存泄漏报告中看到文件和行号。”

结果你会得到新操作符定义的行。你可以使用一个技巧,即new可以接受额外的参数,其中一些可以默认为宏定义的值,例如__LINE____FILE__


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接