现在的位置: 首页 > 综合 > 正文

VC++内存泄漏侦测与处理

2012年04月10日 ⁄ 综合 ⁄ 共 1424字 ⁄ 字号 评论关闭
文章目录
 

关于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;

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

更多资源泄露说明

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

抱歉!评论已关闭.