爱乐眼底图像分析

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 7270|回复: 4

非MFC的C++内存泄露跟踪与调试

[复制链接]
发表于 2012-7-8 16:51:53 | 显示全部楼层 |阅读模式

C++提供的内存管理机制非常灵活,内存的分配和释放完全有程序员自己控制。不过任何事物都是其两面性,灵活的另一面则是带来了复杂性。经常我们用New,malloc,realloc分配了内存,却可能也很容易忘记用Delete,free来释放。C++内存泄露这是很多程序常见的问题,也给初学者带来不少的困惑。如为什么程序运行后内存在不停的增加(Windows通过任务管理器可以观察到)。因为分配了内存而没有释放,逐渐耗尽内存资源,最后导致系统崩溃。内存泄露除了堆中的之外,还包括核心系统资源的内存泄露。那么在STL中目前增加了Smart Point技术,在Java有垃圾回收技术。不过C++中Smart Pointer技术也并不可能解决所有问题,特别是初学者。所以在此介绍一下VC下面C++内存泄露的跟踪和调试,至于内存泄露的详细介绍再次都不再此多说,可以去其他地方寻找参考信息。



回复

使用道具 举报

 楼主| 发表于 2012-7-8 16:52:11 | 显示全部楼层


1、内存检侧需要用到C++ 的CRT库,而调试时必须是Debug模式。要使用CRT库,请增加如下三条语句。

    #define _CRTDBG_MAP_ALLOC
    #include <stdlib.h>
    #include <crtdbg.h>

    注意:这组语句的顺序不可以改变。


回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-8 16:52:24 | 显示全部楼层

2、在程序退出时增加内存泄露报告分析函数:   

    _CrtDumpMemoryLeaks();

    不支持MFC的项目,程序运行的结果应该是

    Detected memory leaks!
    Dumping objects ->
    d:/program files/microsoft visual studio .net 2003/vc7/include/crtdbg.h(689) : {54} normal block at 0x00371078, 4 bytes long.
     Data: <  D > 94 20 44 00
    d:/program files/microsoft visual studio .net 2003/vc7/include/crtdbg.h(689) : {53} normal block at 0x00371038, 4 bytes long.
     Data: <  D > BC 20 44 00
    Object dump complete.

    我们发现无法定位到内存泄露的具体源代码位置。



回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-8 16:52:37 | 显示全部楼层

3、如何解决获得具体泄露的位置:

   
    #ifdef _DEBUG
    #define new   new(_NORMAL_BLOCK,__FILE__, __LINE__)
    #endif

    运行结果如下:

    Detected memory leaks!
    Dumping objects ->
    f:/testvc/factory/factory.cpp(93) : {54} normal block at 0x00371078, 4 bytes long.
     Data: <  D > 94 20 44 00
    f:/testvc/factory/factory.cpp(102) : {53} normal block at 0x00371038, 4 bytes long.
     Data: <  D > BC 20 44 00
    Object dump complete.



回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-8 16:53:12 | 显示全部楼层

4、如何跟踪隐式的内存泄露:

    看到上面的输入结果中的:{54}和{53}了吗,这就是表示内存分配的序号。通过_CrtSetBreakAlloc(53),_CrtSetBreakAlloc(54)就可以发现比较隐藏的内存泄露的具体所在位置。

CRT库还有很多实用的函数,目前就将这几个常用的记录于此,以后用到其他的再增加到此。


(来源:http://blog.csdn.net/leweet/article/details/3707378
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



QQ|Archiver|手机版|小黑屋|爱乐眼底图像分析 ( 京ICP备1201155号 )        

GMT+8, 2024-4-20 15:31 , Processed in 0.054949 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表