使用 _crtBreakAlloc 调试内存泄漏

 按:   在MSDN上发现了一段关于VC调试内存泄漏的文字,   试了一下,   觉得挺好.   好东西不敢独享.   拿出来给大伙儿瞧瞧.   怕您看着麻烦.   随便翻了一下.   翻的不好,   还请大伙儿海涵:)
如果您的确有兴趣,   又觉得翻的实在太烂,   可以查看原文或其连接.  
arcoolgg,lieph@163.com

HOWTO:   使用   _crtBreakAlloc   调试内存泄漏

summary:
当使用   C-Runtime   调试跟踪内存泄漏时,   如果能在导致内存泄漏的地方设置一个断点.   将是很有帮助的.   在编译和运行时,   通过设置   _crtBreakAlloc,   能够在指定的内存分配的地方设置一个用户断点.

details:
当使用   VC   的调试器跟踪内存泄漏时,   它通常会在大括号中显示一个内存分配号(   allocation   number),   下面的例子就是在内存分配号   18   的地方出现内存泄漏.

Detected   memory   leaks!
Dumping   objects   ->
{18}   normal   block   at   0x00660BE4,   10   bytes   long
Data:   <   >   CD   CD   CD   CD   CD   CD   CD   CD   CD   CD
Object   dump   complete.


在导致内存泄漏的地方设置断点之后.   就能够通过调用栈(call   stack)来查看是哪一个函数导致了内存泄漏.   调试函数   _CrtSetBreakAlloc   允许您在特定的内存分配号(   allocation   number)设置断点.   这种方式下,   每一次您都需要重新编译代码.   另一种更好的方式是使用   Watch   窗口,   动态的设置您要设置断点的内存分配号.   这样的话,   您就不用每次都修改代码,   编译程序了.

如果您的程序是静态链接到   C-Runtime,   您需要设置的变量是   _crtBreakAlloc;   如果是动态连接,   在   VC4.0/4.1,   则是   {,,msvcr40d.dll}*__p__crtBreakAlloc(),   在   VC   4.2   以后,   使用   {,,msvcrtd.dll}*__p__crtBreakAlloc().

如果不知道当前使用的   C-Runtime,   您可以这样来查看:
按   alt   +   F7,   在系统设置对话框中的   C/C++   属性页,   Category   中选   Code   Generation.   Use   runtime   library   中显示的就是您使用的   C-Runtime.

在开始调试程序的时候,   按   F11,   程序停在入口处,   在   Watch   窗口中输入   {,,msvcr40d.dll}*__p__crtBreakAlloc(),   应该可以看到它的值为   -1.   双击它,   输入您想设置断点的内存分配号.   如上例中的   18;   F5   运行起来.   在内存泄漏的地方{18},   程序便会遇到断点.   这样,   您就可以调试了.  

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值