gpt4 book ai didi

c++ - CRT 不打印内存泄漏的行号

转载 作者:行者123 更新时间:2023-11-30 01:06:56 27 4
gpt4 key购买 nike

我有下面的代码,我认为它基于 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。

最佳答案

来自MSDN topic :

These techniques work for memory allocated using the standard CRT malloc function. If your program allocates memory using the C++ new operator, however, you may only see the file and line number where the implementation of global operator new calls _malloc_dbg in the memory-leak report. Because that behavior is not very useful, you can change it to report the line that made the allocation by using a macro that looks like this:

#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。我测试了它,它可以与您的代码一起正常工作。


实际上,用 DBG_NEW 替换代码中的所有地方的 new 是一项非常乏味的任务,所以您可以使用这个宏:

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

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

关于c++ - CRT 不打印内存泄漏的行号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45304757/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com