VC++内存泄漏检测方法(1):_CrtSetBreakAlloc

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。详情见:

VC++内存泄漏检测方法(2):Checkpoint/DumpStatistics

VC++内存泄漏检测方法(3):Visual Leak Detector(VLD内存泄漏检测工具)

发布了455 篇原创文章 · 获赞 535 · 访问量 324万+

猜你喜欢

转载自blog.csdn.net/libaineu2004/article/details/104071627
今日推荐