内存泄漏检测方法

一、首先写代码时要控制内存的释放,好比new以后要delete,看析构函数是否真的执行(不少人编写释放内存的代码在析构函数中处理的),若是没有真正执行,就须要动态释放对象;前段时间在一个项目中使用了单例模式对象,将构造函数和析构函数设置成保护类型,在运行代码时退出时不执行到析构函数里面(具体也不知道什么缘由),最后只有手动删除对象。linux

二、其次让程序长时间运行,看任务管理器对应程序内存是否是一直向上增长;函数

三、最后使用经常使用内存泄漏检测工具来检测内存泄漏点。工具

文本主要描述一些内存泄漏检测工具功能介绍与简单使用方法。指针

1、对于VS2005/VS2008编译器自带的内存检测工具/函数。 在 main() 函数开头加上: #include “crtdbg.h” _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF|_CRTDBG_LEAK_CHECK_DF);对象

2、用BoundsChecker之类的工具。内存

BoundsChecker 是一个Run-Time错误检测工具,它主要定位程序在运行时期发生的各类错误。BoundsChecker能检测的错误包括:资源

一、指针操做和内存、资源泄露错误,好比:文档

内存泄露;编译器

资源泄露;内存管理

对指针变量的错误操做。

二、内存操做方面的错误,好比:

内存读、写溢出;

使用未初始化的内存。

三、API函数使用错误

3、linux下能够用valgrind检测内存泄露错误。

4、purify工具,这个是专门检测内存的,包括泄露、越界、指针跑飞等均可以检查,在VC上使用方便。

5、用Windbg,试过查句柄泄漏的,比较方便。

6、Visual Leak Detector

Visual Leak Detector是一款用于Visual C++的免费的内存泄露检测工具。相比较其它的内存泄露检测工具,它在检测到内存泄漏的同时,还具备以下特色:

一、 能够获得内存泄漏点的调用堆栈,若是能够的话,还能够获得其所在文件及行号;

二、 能够获得泄露内存的完整数据;

三、 能够设置内存泄露报告的级别;

四、 它是一个已经打包的lib,使用时无须编译它的源代码。而对于使用者本身的代码,也只须要作很小的改动;

五、 他的源代码使用GNU许可发布,并有详尽的文档及注释。对于想深刻了解堆内存管理的读者,是一个不错的选择。