Visual Studio 2008 (C++) 内存泄漏检测未显示文件/方法位置 - 如何使其正常工作?

2023-11-26

我正在使用此处找到说明尝试查找 Win32 应用程序中的内存泄漏。正如所描述的,我把

#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>

文件顶部的行(包含 WINAPI _tWinMain 的 cpp 文件),然后在 winmain 的退出点我添加了行

_CrtDumpMemoryLeaks();

不幸的是,我没有看到泄漏的行号/位置(但我确实得到了泄漏列表)。

我也尝试过放

_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); 
_CrtSetReportMode ( _CRT_ERROR, _CRTDBG_MODE_DEBUG); 

在 winmain 的开头 - 再次,没有运气。

我觉得这很奇怪,因为我通常在发现泄漏或自动报告泄漏方面没有任何问题。

这是一个巨大的、旧的遗留应用程序,我正在为新雇主开发。过去我一直使用标准 VS 向导进行工作。

关于如何获取导致泄漏的源代码行/方法有什么建议吗? (或者至少是“新”呼叫的线路?

EDIT:

我也尝试过视觉检漏仪- 没有成功。

很奇怪。

EDIT

我尝试使用下面列出的 new 的重新定义,但是在编译 boost 时出现错误。


您确定泄漏的代码正在使用 CRT 调试分配例程吗?这需要使用malloc() or new(相对于LocalAlloc, GlobalAlloc,一些自定义块分配器等..)_DEBUG(我认为)必须在包含 CRT 标头时定义。

为了获取泄漏的源代码行,您需要定义DEBUG_NEW分配发生在任何地方。这是因为为了跟踪它们,每个分配都必须替换为包含以下内容的调用__FILE__ and __LINE__。向导的标准定义如下所示:

#ifdef _DEBUG
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__)
#define new DEBUG_NEW
#endif

这不处理malloc,如果您正在调试的代码使用,可能有类似的咒语malloc代替new.

如果您使用预编译头,您可以将其放入预编译头文件中,它将影响该项目中的所有源文件。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Visual Studio 2008 (C++) 内存泄漏检测未显示文件/方法位置 - 如何使其正常工作? 的相关文章

随机推荐