zoukankan      html  css  js  c++  java
  • VC++内存泄漏侦测与处理

     

    关于C++内存泄露

    C与C++是开发各种高性能软件与设备驱动软件的必然选择,虽然其它编程语言层出不穷,但C与C++依然处于王者地位。C与C++是最接近汇编语言的高级编程语言,其内存分配与释放均由用户代码自行控制,这样的机制让程序员有了更广的发挥空间,但也产生了深为诟病的内存泄漏问题,也成为很多具有内存自动回收管理机制的编程语言代替C与C++的原因。对于一般小应用程序来说,一点内存泄露不算什么。但是当内存泄漏问题出现在需要7X24小时运行的平台类程序上的时候,将会使系统可用内存飞速减少,最后耗尽系统资源,导致系统崩溃。

    不管是新手,还是有超过10年编程经验的老手,在开发过程中发生内存泄露都是不可避免的。所以学会如何防止并检查内存泄漏,是一个合格的c++程序员必须具备的能力。因为内存泄露在导致系统崩溃前是无任何症兆的,从大量的代码中要靠人工找出泄漏,无论对新人还是老手都是一场噩梦。

    微软的VC开发工具为我们检查内存泄露提供了很好的功能,本文介绍一种在VC++中检查内存泄漏的方法,供大家参考。

    侦测内存泄露

    首先在StdAfx.h中添加如下代码,开启程序对内存泄露的侦测,注意必须定义宏_CRTDBG_MAP_ALLOC,并包括相关头文件。

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

    在程序启动之时调用 _CrtSetDbgFlag 告知程序在退出时报告泄露的内存。如果是应用程序,在main或WinMain函数中加入如下代码,如果是动态链接库(DLL)程序,可以在DllMain的DLL_PROCESS_ATTACH执行分支中加入如下代码。

    _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );

    如上处理后,如果程序有内存泄漏,在程序退出时就会在VS的输出调试窗口中输出类似下面的内容,这样就可以判断出程序存在内存泄漏。

    Detected memory leaks!
    Dumping objects ->
    {1867} normal block at 0x01E18B88, 16 bytes long.
    Data: < o > A8 1C 19 00 00 00 00 00 B0 6F 18 00 CD CD CD CD
    {1866} normal block at 0x01E18B28, 32 bytes long.
    Data: < > 88 8B E1 01 00 00 00 00 00 00 00 00 00 00 00 00
    {1865} normal block at 0x01E18AD8, 16 bytes long.
    Data: < > F0 01 00 00 1E 04 00 00 BA 02 00 00 1F 04 00 00

    定位内存泄露发生的代码

    在上面的_CrtSetDbgFlag 方法之后加入下面一句代码,告诉程序在运行到发生内存泄露处的代码时中断。其右边的参数就是上面报告中出现的第一个数字。

    _crtBreakAlloc = 1867;

    发现发生内存泄露的代码,就可以分析自己的程序,并加入相应的释放代码。在内存泄露处理好之后,注释掉上面一句代码。经过这样的处理,就可以把程序中的内存泄露排除得干干净净。

    更多资源泄露说明

    上面针对内存泄露的处理只对用 malloc 或 new 分配的内存有效,而用Windows本身的内存API函数是无法侦测到的,所以对于这些内存分配还需进行更仔细的检查,或改为 malloc 或 new 分配内存。

    在Windows程序中还会用到很多多种类型的资源,如窗口句柄、文件句柄、HDC等,这些用到的资源也需要进行响应的释放,一旦发生泄露也有可能发生灾难性的后果。对这些资源进行类封装,在C++ class的析构函数中进行释放操作是非常好的处理方式。


    锐浪报表Grid++Report源自2003年,经过多年持续不断发展,是拥有最多软件开发者的报表工具。易学易用,功能丰富,成熟稳定,支持各种编程环境下的报表开发。

  • 相关阅读:
    python2和python3的import区别
    设计模式:装饰器(Decorator)模式
    设计模式:组合(Composite)模式
    设计模式:策略模式
    设计模式:桥接(Bridge)模式
    设计模式:抽象工厂模式
    设计模式:Builder模式
    设计模式:原型模式
    设计模式:单例模式
    设计模式:工厂方法
  • 原文地址:https://www.cnblogs.com/report/p/1784350.html
Copyright © 2011-2022 走看看