Detected memory leaks!
Dumping objects ->
{1474} normal block at 0x0000000000335DF0, 16 bytes long.
Data: < 4 > 10 80 34 00 00 00 00 00 00 00 00 00 00 00 00 00
{1473} normal block at 0x0000000000348010, 960 bytes long.
Data: < > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
{1472} normal block at 0x0000000000335DA0, 16 bytes long.
Data: <` > 60 D4 87 03 00 00 00 00 00 00 00 00 00 00 00 00
{1471} normal block at 0x000000000387D460, 3200 bytes long.
Data: < > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
{1470} normal block at 0x0000000003879040, 712 bytes long.
Data: < ,@ ,@ > 80 94 2C 40 01 00 00 00 D8 94 2C 40 01 00 00 00
Object dump complete.
解决方法
1、在程序开始的地方,加上代码:
_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
_CrtSetBreakAlloc(1472); //1472为上面内存泄漏的块号。
_CrtSetBreakAlloc(1471);
_CrtSetBreakAlloc(1470);
2、用Debug模式运行,程序自动断点在“内存块1472”分配的位置。
/* break into debugger at specific memory allocation */
if (_crtBreakAlloc != -1L && lRequest == _crtBreakAlloc)
_CrtDbgBreak();
3、我们已经找到了泄漏的那块内存分配的底层操作的地方了。这个时候一直利用“调试”-“退出”,或快捷键“SHIFT+F11”跳转,直到看到了自己的代码。
4、检查自己在该代码中分配的内存块,是否进行了合理的释放。
5.最后,记得把_CrtSetBreakAlloc(xxx); 这句话删除掉,否则每次debug都断点,耽误事儿。
另外,除了_CrtSetBreakAlloc这方法之外,还可以使用Visual Leak Detector。详情见: