我目前正在调试一些代码,使用带有CrtDbg的Visual Studio 2012删除或至少查找内存泄漏。
问题是,只要分配数量不变,追踪分配就相当容易了。当分配数量发生很大变化(或者不是真正的确定性)时,如何找到泄漏的分配点?我至少可以说,哪个模块正在分配内存?
关闭应用程序时我有以下几行:
Detected memory leaks!
Dumping objects ->
{2789444} normal block at 0x0000000006103CB0, 32 bytes long.
Data: < q f > B8 71 E4 66 00 00 00 00 00 00 00 00 00 00 00 00
{1269709} normal block at 0x000000000A50C6A0, 1008 bytes long.
Data: < ) > 01 00 00 00 0B 00 00 00 29 00 00 00 CD CD CD CD
...
{2194} normal block at 0x0000000000278060, 16 bytes long.
Data: < > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Object dump complete.
最后一个分配编号2194是可重现的,与静态初始化程序有关。但其他数字正在发生变化。
我不能使用地址找到它吗?或者有一个更简单的解决方案吗?
帮助会很棒。
答案 0 :(得分:1)
我建议你使用视觉检漏仪。我应该为您提供所需的所有详细信息,以便跟踪泄漏并且易于安装。 见here
答案 1 :(得分:1)
试试Debug Diagnostic Tool v2.0,它是Windows上非常好的内存驱动程序工具,它来自Microsoft,它是免费的。
如果第三方库泄漏内存,该工具可以找到库,只是没有调用堆栈信息。
要通过此调试器启动exe,请转到菜单&#39;工具&#39; - &gt;&#34;预连接配置&#39;,为您的exe启用预连接调试器。
答案 2 :(得分:0)
创建以下目录结构:
Visual Leak Detector
include
vld.h
vld_def.h
lib
Win32
vld.lib
Win64
vld.lib
bin
Win32
vld_x86.dll
Win64
vld_x64.dll
在主要功能上方添加以下内容:
#ifdef _DEBUG_MEM
#include <vld.h>
#endif
在项目设置中添加以下内容:
_DEBUG_MEM in the preprocessor-definitions
Visual Leak Detector\include in the include-path
Visual Leak Detector\lib\Win<xx> in the library-path
Visual Leak Detector\bin\Win<xx> in the executable-path
答案 3 :(得分:0)
您可以使用以下技术:
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
class MemChecker
{
friend class foo;
struct foo
{
HANDLE hLogFile;
_CrtMemState _ms;
foo()
{
hLogFile = CreateFile(TEXT("memory_leaks.txt"), GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
_CrtSetReportMode( _CRT_WARN, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG); // enable file output
_CrtSetReportFile( _CRT_WARN, hLogFile ); // set file to stdout
_CrtMemCheckpoint(&_ms); // now forget about objects created before
// breaks on N-th memory allocation
// look for this number in report file (in curved brackets)
//_CrtSetBreakAlloc(1518);
}
~foo()
{
_CrtMemDumpAllObjectsSince(&_ms); // dump leaks
CloseHandle(hLogFile);
}
};
static foo obj;
};
MemChecker::foo MemChecker::obj;
使用此声明,每次运行程序时,都会以适当的方式检测并报告内存泄漏。
此外,您可以将断点设置为特别的内存泄漏(读取代码中的注释)。怎么做:你运行应用程序,看看,内存泄漏的数量,然后你设置_CrtSetBreakAlloc(2789444 *),所以下次你运行应用程序 - 它打破了分配内存(泄漏)的地方
您可以更仔细地阅读有关标志_CRTDBG_MODE_FILE,_CRTDBG_MODE_DEBUG的信息,以指定调试消息将被输出的位置。
*来自您的示例,{2789444}正常块位于0x0000000006103CB0,32个字节长。