泄漏检测为什么不给我行号?

时间:2013-03-04 02:02:13

标签: c++ memory-leaks visual-studio-debugging

我最近使用原始指针将程序转换为std::shared_ptr,并希望确保没有内存泄漏。我查看了MSDN的Finding Memory Leaks Using the CRT Library页面,并按照说明设置了报告。

我首先将这些行添加到我的文件中:

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

并使用 - _CrtDumpMemoryLeaks();

调用报告

我确实使用new来分配我的记忆,正如页面建议的那样,我补充说......

#ifdef _DEBUG   
#ifndef DBG_NEW      
#define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__ )      
#define new DBG_NEW   
#endif
#endif  // _DEBUG

在更精确的泄漏位置方面没有显着变化。相反,我的报告仍然如下:

Detected memory leaks!
Dumping objects ->
{158} normal block at 0x006F8458, 8 bytes long.
 Data: <  ,     > DC F6 2C 00 00 00 00 00 
{155} normal block at 0x006FAD40, 40 bytes long.
 Data: <L>              > 4C 3E 17 01 03 00 00 00 01 00 00 00 CD CD CD CD 
{154} normal block at 0x006FAB68, 16 bytes long.
 Data: <d>              > 64 3E 17 01 01 00 00 00 01 00 00 00 00 00 00 00 
{149} normal block at 0x006FAC08, 40 bytes long.
 Data: <L>              > 4C 3E 17 01 03 00 00 00 01 00 00 00 CD CD CD CD 
{148} normal block at 0x006FABB8, 16 bytes long.
 Data: <d>              > 64 3E 17 01 01 00 00 00 01 00 00 00 00 00 00 00 
Object dump complete.
The program '[7152] List.exe' has exited with code 0 (0x0).

不幸的是,报告是在退出之前生成的,因此无法实时查看泄漏。

通过查看对此question的回答,我注意到我没有加载pdb文件,因为它是一个空项目。所以我按照here给出的建议解决了pdb问题,但未能解决我的问题。

应用程序是从一个空控制台应用程序生成的,如果这很重要,我正在以管理员身份运行。

此外,我知道我可以使用的外部工具,但我经常使用我无权添加任何内容的计算机,因此让VS正常运行是理想的解决方案。任何帮助报告显示泄漏的行号都会很棒。

旁注:

我想问一个合乎逻辑的问题是 - 如果你正在使用托管指针,为什么我还有内存泄漏?好吧,我留下了一些本地化指针,这些指针只是临时持有者等等,似乎不应该引起问题。所以,我觉得我知道它在哪里发生,但这是一个如此简单的程序,我想知道它是如何实现的,所以我可以在较大的程序上使用它。感谢。

3 个答案:

答案 0 :(得分:0)

您需要确保stdlib的定义和包含在应用程序中的任何其他包含之前。

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

应该是您申请中的第一件事。

答案 1 :(得分:0)

您必须验证您在项目中声明的所有类都包含 crtdbg.h 和宏 _crtdbg_map_alloc 以及最后的报告。

答案 2 :(得分:0)

我发现我必须把

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

在可能是分配的潜在来源的每个文件中。我假设我只需要在主程序中执行此操作,其中

_CrtDumpMemoryLeaks();

被调用。