内存泄漏是编程中常常见到的一个问题,我所遇过的原因有两个: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;
}
相关推荐
可以看出,对于每一个内存泄漏,这个报告列出了它的泄漏点、长度、分配该内存时的调用堆栈、和泄露内存的内容(分别以16进制和文本格式列出)。双击该堆栈报告的某一行,会自动在代码编辑器中跳到其所指文件的对应...
4、在项目开始文件中,加入如下代码: #include "stdafx.h" #ifdef _DEBUG #include "vld.h" #endif 5、以调试方式运行项目,关闭项目后,log中会有如下,表示成功 No memory leaks detected. Visual Leak ...
向可用内存池(pool)中返回部分内存,以使其可以由程序的其他部分或者其他程序使用。 实现这些需求的程序库称为分配程序(allocators),因为它们负责分配和回收内存。程序的动态性越强,内存管理就越重要,您的...
检查内存泄漏源码 DigiStatic_src 自绘CStatic实现数字效果。 DirectShow开发指南pdf附属代码 如题。 DirectShow开发指南源码 如题。 directUI_D DirectUI界面库 DOM应用---遍历网页中的元素 如题。 ...
向可用内存池(pool)中返回部分内存,以使其可以由程序的其他部分或者其他程序使用。 实现这些需求的程序库称为 分配程序(allocators),因为它们负责分配和回收内存。程序的动态性越强,内存管理就越重要,您的...
检查内存泄漏源码 DigiStatic_src 自绘CStatic实现数字效果。 DirectShow开发指南pdf附属代码 DirectShow开发指南源码 directUI_D DirectUI界面库 DOM应用---遍历网页中的元素 dshowplayer 媒体播放器的实现,...
BoundsChecker 能自动指出静态,堆栈内存错误和资源泄漏问题。BoundsChecker 能够校验最新的 Windows APIs,包括 ActiveX, DirectX, OLE/COM, ODBC等等。能够发现与 Windows 平台兼容性。 BCGControlBar Library ...
检查内存泄漏源码 DigiStatic_src 自绘CStatic实现数字效果。 DirectShow开发指南pdf附属代码 DirectShow开发指南源码 directUI_D DirectUI界面库 DOM应用---遍历网页中的元素 dshowplayer 媒体播放器的实现,...
推断检查是否有空指针解除引用,内存泄漏,编码约定和不可用的API。 从“入门指南”和我们的其他文档开始下载并尝试“自己推断”。 Infer仍在发展,我们希望继续公开进行开发。 我们希望它对其他项目有用,所以请...
这是一篇介绍如何使用CheckMem.pas单元检查delphi应用程序内存泄漏的文章 作者:999roseto347(fdaf at 163 dot com) 版本:V1.0 创建日期:2004-06-11 目录: 一、使用步骤 二、报告解读 三、测试...
检查内存泄漏源码 DigiStatic_src 自绘CStatic实现数字效果。 DirectShow开发指南pdf附属代码 DirectShow开发指南源码 directUI_D DirectUI界面库 DOM应用---遍历网页中的元素 dshowplayer 媒体播放器的实现,...
检查内存泄漏源码 DigiStatic_src 自绘CStatic实现数字效果。 DirectShow开发指南pdf附属代码 DirectShow开发指南源码 directUI_D DirectUI界面库 DOM应用---遍历网页中的元素 dshowplayer 媒体播放器的实现,...
检查内存泄漏源码 DigiStatic_src 自绘CStatic实现数字效果。 DirectShow开发指南pdf附属代码 DirectShow开发指南源码 directUI_D DirectUI界面库 DOM应用---遍历网页中的元素 dshowplayer 媒体播放器的实现,...
近日在CDB并行测试中发现一个问题:我们需要的小区负荷话统结果总是为零,开始还以为小区负荷太小,于是加大短消息下发数量,但还为零,于是在程序中加入测试代码,把收到的数据在BAM上打印出来, 结果打印出来的...
“在库中的对应命令名”以@开头表示以cdecl方式调用,否则表示以默认的stdcall方式调用;各参数声明要与其定义一致。 请参考易语言安装目录内的例程:samples\静态编译\调用LIB和OBJ 1. 静态编译方面的改进和...