`
yiyeqinghuasoon
  • 浏览: 644820 次
文章分类
社区版块
存档分类
最新评论

加入代码以检查C++中的内存泄漏

 
阅读更多

内存泄漏是编程中常常见到的一个问题,我所遇过的原因有两个:1.分配完内存后忘记回收

2.代码有问题,造成想回收却无法回收,例如:

int* p=new int;

p=new int; //p指针修改,原来申请内存的地址没有记录下来,于是无法释放

下面介绍如何检查内存泄漏:

1.包含头文件和定义

#define _CRTDBG_MAP_ALLOC //并非绝对需要该语句,但如果有该语句,打印出来的是文件名和行数等更加直观的信息#include <stdlib.h> #include <crtdbg.h> (1)#include语句必须采用上文所示顺序。如果更改了顺序,所使用的函数可能无法正确工作

(2)此方法只在调试版本(Debug)中有效

2.方法一:使用_CrtDumpMemoryLeaks()

#include <stdlib.h> #include <crtdbg.h> int main(int argc , char* argv[])

{

{

new int;

}

_CrtDumpMemoryLeaks();

return 0;

}

output:

etected memory leaks!

Dumping objects ->

{49} normal block at 0x00384DA8, 4 bytes long.

Data: < > CD CD CD CD

其内容包括:内存分配型号(在大括号内)、块类型(普通、客户端或CRT)、十六进制形式的内存位置、以字节为单位的块大小、以字节为单位的块大小、前16字节的内容(十六进制)

注意:

(1)大括号的位置,如果不加{new int;},这块内存是等到main函数结束才泄漏的,而_CrtDumpMemoryLeaks()是在main函数里调用的,于是判断内存泄漏

int main(int argc , char* argv[])

{

LytString Test="";

_CrtDumpMemoryLeaks();

return 0;

}

output:

Detected memory leaks!

Dumping objects ->

{49} normal block at 0x00384DA8, 1 bytes long.

Data: < > 00

(2)对于一些全局函数,如果初始化时申请了内存,到程序结束时候才释放,此函数会一直把新申请的内存当作泄漏来对待

LytString Test="";

int main(int argc , char* argv[])

{

_CrtDumpMemoryLeaks();

return 0;

}

output:

Detected memory leaks!

Dumping objects ->

{49} normal block at 0x00384DA8, 1 bytes long.

Data: < > 00

可以通过exit解决:

LytString Test="";

int main(int argc , char* argv[])

{

exit(1);

_CrtDumpMemoryLeaks();

return 0;

}

2.方法二:在程序入口写几个语句,程序退出时,如果发现有内存泄漏,会自动在DEBUG OUTPUT窗口和DebugView中输出内存泄漏信息

int tmpFlag = _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG );

tmpFlag |= _CRTDBG_LEAK_CHECK_DF;

_CrtSetDbgFlag( tmpFlag );

3.方法三:使用_CrtMemCheckpoint(),可以查出某程序段的内存泄漏情况

int main(int argc , char* argv[])

{

CrtMemState s1, s2, s3;

_CrtMemCheckpoint( &s1 );

new int; //程序段

_CrtMemCheckpoint( &s2 );

if ( _CrtMemDifference( &s3, &s1, &s2) ) _CrtMemDumpStatistics( &s3 );

return 0;

}

分享到:
评论

相关推荐

    vld(Visual Leak Detector 内存泄露检测工具 源码)

     可以看出,对于每一个内存泄漏,这个报告列出了它的泄漏点、长度、分配该内存时的调用堆栈、和泄露内存的内容(分别以16进制和文本格式列出)。双击该堆栈报告的某一行,会自动在代码编辑器中跳到其所指文件的对应...

    vs内存泄漏检测工具

    4、在项目开始文件中,加入如下代码: #include "stdafx.h" #ifdef _DEBUG #include "vld.h" #endif 5、以调试方式运行项目,关闭项目后,log中会有如下,表示成功 No memory leaks detected. Visual Leak ...

    内存管理内存管理内存管理

    向可用内存池(pool)中返回部分内存,以使其可以由程序的其他部分或者其他程序使用。 实现这些需求的程序库称为分配程序(allocators),因为它们负责分配和回收内存。程序的动态性越强,内存管理就越重要,您的...

    vc++ 开发实例源码包

    检查内存泄漏源码 DigiStatic_src 自绘CStatic实现数字效果。 DirectShow开发指南pdf附属代码 如题。 DirectShow开发指南源码 如题。 directUI_D DirectUI界面库 DOM应用---遍历网页中的元素 如题。 ...

    操作系统(内存管理)

    向可用内存池(pool)中返回部分内存,以使其可以由程序的其他部分或者其他程序使用。 实现这些需求的程序库称为 分配程序(allocators),因为它们负责分配和回收内存。程序的动态性越强,内存管理就越重要,您的...

    vc++ 应用源码包_6

    检查内存泄漏源码 DigiStatic_src 自绘CStatic实现数字效果。 DirectShow开发指南pdf附属代码 DirectShow开发指南源码 directUI_D DirectUI界面库 DOM应用---遍历网页中的元素 dshowplayer 媒体播放器的实现,...

    VC6插件系列

    BoundsChecker 能自动指出静态,堆栈内存错误和资源泄漏问题。BoundsChecker 能够校验最新的 Windows APIs,包括 ActiveX, DirectX, OLE/COM, ODBC等等。能够发现与 Windows 平台兼容性。 BCGControlBar Library ...

    vc++ 应用源码包_5

    检查内存泄漏源码 DigiStatic_src 自绘CStatic实现数字效果。 DirectShow开发指南pdf附属代码 DirectShow开发指南源码 directUI_D DirectUI界面库 DOM应用---遍历网页中的元素 dshowplayer 媒体播放器的实现,...

    Infer:用于Java,C,C ++和Objective-C的静态分析器-开源

    推断检查是否有空指针解除引用,内存泄漏,编码约定和不可用的API。 从“入门指南”和我们的其他文档开始下载并尝试“自己推断”。 Infer仍在发展,我们希望继续公开进行开发。 我们希望它对其他项目有用,所以请...

    CheckMem.pas

     这是一篇介绍如何使用CheckMem.pas单元检查delphi应用程序内存泄漏的文章 作者:999roseto347(fdaf at 163 dot com) 版本:V1.0 创建日期:2004-06-11 目录: 一、使用步骤 二、报告解读 三、测试...

    vc++ 应用源码包_1

    检查内存泄漏源码 DigiStatic_src 自绘CStatic实现数字效果。 DirectShow开发指南pdf附属代码 DirectShow开发指南源码 directUI_D DirectUI界面库 DOM应用---遍历网页中的元素 dshowplayer 媒体播放器的实现,...

    vc++ 应用源码包_2

    检查内存泄漏源码 DigiStatic_src 自绘CStatic实现数字效果。 DirectShow开发指南pdf附属代码 DirectShow开发指南源码 directUI_D DirectUI界面库 DOM应用---遍历网页中的元素 dshowplayer 媒体播放器的实现,...

    vc++ 应用源码包_3

    检查内存泄漏源码 DigiStatic_src 自绘CStatic实现数字效果。 DirectShow开发指南pdf附属代码 DirectShow开发指南源码 directUI_D DirectUI界面库 DOM应用---遍历网页中的元素 dshowplayer 媒体播放器的实现,...

    华为编程开发规范与案例

    近日在CDB并行测试中发现一个问题:我们需要的小区负荷话统结果总是为零,开始还以为小区负荷太小,于是加大短消息下发数量,但还为零,于是在程序中加入测试代码,把收到的数据在BAM上打印出来, 结果打印出来的...

    易语言程序免安装版下载

    “在库中的对应命令名”以@开头表示以cdecl方式调用,否则表示以默认的stdcall方式调用;各参数声明要与其定义一致。  请参考易语言安装目录内的例程:samples\静态编译\调用LIB和OBJ 1. 静态编译方面的改进和...

Global site tag (gtag.js) - Google Analytics