轻松解决内存泄露(不依赖MFC)

本文详细介绍了如何利用crtdbg.h头文件中的_CrtDumpMemoryLeaks()函数和_CrtSetDbgFlag()、_CrtSetBreakAlloc()函数来追踪和定位C++程序中的内存泄露问题。通过设置调试标志和分配内存跟踪,可以在输出窗口中获取内存泄露信息,并通过双击ID来定位具体的内存分配语句。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     首先,我们要清楚,VC编译器可以将跟踪内存分配情况的代码嵌入到目标程序的能力,这些代码的头文件就是crtdbg.h。当你使用MFC时,将它include之后,只需在程序刚开始执行的地方调用_CrtDumpMemoryLeaks(),调试一次程序,内存泄露的情况就会输出到“输出”窗口,详情见http://blog.youkuaiyun.com/HeavenMonkey/archive/2008/05/24/2476411.aspx

     如果你的程序没有使用MFC,也不想使用它,那么_CrtDumpMemoryLeaks()也可以用,但是“输出”窗口中的内存泄露条目是不支持双击定位的,也就是说,你只知道泄露了,但不能是哪一行代码引起的,这样达不到调试目标。

     其实,crtdbg.h是不依赖于MFC的,只是对MFC支持很好。在这种情况下,可以采用以下方法定位泄露内存语句:

1)程序开始处,加入:

 int nFlag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);
 nFlag |= _CRTDBG_LEAK_CHECK_DF;
 _CrtSetDbgFlag(nFlag);

     以上三行使嵌入的调试线程开启内存分配跟踪,与调用_CrtDumpMemoryLeaks()相似,内存泄露的情况会被输出到“输出”窗口。仔细观察内存泄露的情况,会发现每个内存泄露前面,都有一个{n},n是一个整数,可以看成该信息的id,其实是说程序的第几次内存分配没有回收。

2)在以上三行后面,加入:

_CrtSetBreakAlloc(n);

     其中n就是某一个内存泄露的id,调试一下,你会发现,程序停止在某一行,这就是对应该id分配的地方。然后就看你的了,解决它吧!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值