Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Visual Studio 2008(C+;+;)内存泄漏检测未显示文件/方法位置-如何使其工作?_C++_Visual Studio 2008_Memory Leaks - Fatal编程技术网

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

C++ Visual Studio 2008(C+;+;)内存泄漏检测未显示文件/方法位置-如何使其工作?,c++,visual-studio-2008,memory-leaks,C++,Visual Studio 2008,Memory Leaks,我正在使用查找Win32应用程序中的内存泄漏。如前所述,我将 #define _CRTDBG_MAP_ALLOC #include <stdlib.h> #include <crtdbg.h> 不幸的是,我没有看到泄漏的行号/位置(但我得到了泄漏列表) 我也试着把 _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); _CrtSetReportMode ( _CRT_ERROR, _CRTDBG

我正在使用查找Win32应用程序中的内存泄漏。如前所述,我将

#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
不幸的是,我没有看到泄漏的行号/位置(但我得到了泄漏列表)

我也试着把

_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); 
_CrtSetReportMode ( _CRT_ERROR, _CRTDBG_MODE_DEBUG); 
在winmain的开始,再次,没有运气

我觉得这很奇怪,因为我通常在发现漏洞或自动报告漏洞时都没有问题

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

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

编辑:

-没有成功

很奇怪

编辑


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

您确定泄漏的代码使用的是CRT调试分配例程吗?这需要使用
malloc()
new
(与
LocalAlloc
GlobalAlloc
、一些自定义块分配器等相反,
\u DEBUG
(我认为)必须在包含CRT头时定义

为了获取泄漏的源代码行,您需要在发生分配的任何地方进行定义。这是因为为了跟踪它们,每个分配都必须替换为包含
\uuuuuuu FILE\uuuuu
\uuuuuu LINE\uuuu
的调用。向导中的标准定义如下所示:

#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
Detected memory leaks!
Dumping objects ->
{12913} normal block at 0x000002BC648BB9D0, 82 bytes long.
 Data: <h t t p : / / a > 68 00 74 00 74 00 70 00 3A 00 2F 00 2F 00 61 00
{12912} normal block at 0x000002BC648B8030, 24 bytes long.
 Data: <0  d      `     > 30 CD 89 64 BC 02 00 00 D8 02 60 E5 F7 7F 00 00
...
\ifdef\u调试
#定义\u CRTDBG\u映射\u ALLOC
#包括
#包括
#定义调试\新建(\正常\块、\文件、\行)
#定义新调试\u新
#恩迪夫
这不能处理
malloc
,如果您调试的代码使用
malloc
而不是
new
,则可能有类似的咒语


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

在运行结束时给出泄漏列表,例如:

#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
Detected memory leaks!
Dumping objects ->
{12913} normal block at 0x000002BC648BB9D0, 82 bytes long.
 Data: <h t t p : / / a > 68 00 74 00 74 00 70 00 3A 00 2F 00 2F 00 61 00
{12912} normal block at 0x000002BC648B8030, 24 bytes long.
 Data: <0  d      `     > 30 CD 89 64 BC 02 00 00 D8 02 60 E5 F7 7F 00 00
...

在分配之前的代码中的某个地方:单元测试或主函数的开始是一些可能的例子将在分配分配编号为
12913
的块时引发异常,从调试器中的调用堆栈很容易找到分配发生的位置。

是的,不使用globalalloc。这对我来说非常奇怪。我将尝试添加redef的new,看看会发生什么。我认为这可以解决我的问题,但在项目中编译boost内容会让人窒息。我想我将不得不以某种方式分离boost问题。我也遇到过这种情况。一些boost库覆盖了
操作符new
,因此在包含boost头文件或至少其中一些头文件后,您必须执行
调试新的定义。我希望这不是w变通…好吧,除了卷起袖子什么都没做。谢谢,我想我知道为什么这个被删除了…有人给这个项目增加了动力,并拿出了新的调试工具。我不明白为什么它不在那里。试试deleaker。它应该会帮到你。