VC编程中的调试宏和内存泄漏

一  调试宏

   MFC中经常会有一些用于调试的宏,比如TRACE,ASSERT和VERFIY。它们的好处就是在我们开发的时候也就是debug模式下,可以给我们提供一些调试信息,而在release模式下面不会产生这些调试信息,也就不会影响我们代码的性能,如果我们用printf()函数的话那么在release模式下也是会产生打印信息的,所以使用这些宏能够让我们的开发更加有效。

  TRACE的用法主要由两种,带参数和不带参数的:

TRACE("This is for test\n");
TRACE("This is %dth test\n",2);

如果我们在代码中添加这两句,并且设置断点,那么在调试的时候可以在Output窗口中观察到打印信息:

   对于ASEERT宏和VERFIY宏,其功能差不多,都是确保后面的表达式为真,但是在release模式下面,VERFIY宏还是会计算表达式的值,而ASSERT却不会,所以我个人认为大部分情况使用ASEERT就行了。

二 检查内存泄漏

   在MFC中,检查内存泄漏也非常简单,MFC会给我们预先定义一些宏,如果在debug模式下,会定义_DEBUG,并且会自动添加如下代码

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

上面的代码会将我们的new 替换成DEBUG_NEW,这个宏可以记录所有开辟内存的文件名和对应代码的行号,而一旦释放了就会删除相应的记录,所以如果存在内存泄漏,那么最后就会产生记录,我们同样可以在调试的Output窗口中看到内存泄漏的信息:

从上面的结果可以看出,我们开辟了40个字节没有释放,最后的转存信息也表明在etfdemodlg.cpp中的78行有40 bytes long的数据没有释放。


上面的情况是在MFC中的,如果我们只是建立了一个普通的c++工程的话,其实也可以利用相似的方法进行判断,这时我们自己添加下列代码就行了

#define new DEBUG_NEW
#include<afx.h>

因为DEBUG_NEW的定义是在<afx.h>中,所以要包含相应的头文件。


最后,因为这个方法的实现其实是利用了CmemoryStated的方法DumpAllObjectsSince实现的,所以我们可以自己在程序的中间利用DumpAllObjectsSince函数来检测相应位置的内存使用情况,具体的方法可以参见MSDN。






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值