http://soft.yesky.com/lesson/110/2381610.shtml
内存泄漏是编程中常常见到的一个问题,我所遇过的原因有两个:
1.分配完内存后忘记回收
2.代码有问题,造成想回收却无法回收,例如:
int*p=newint;
p=newint;//p指针修改,原来申请内存的地址没有记录下来,于是无法释放
下面介绍如何检查内存泄漏:
1.包含头文件和定义
#define_CRTDBG_MAP_ALLOC//并非绝对需要该语句,但如果有该语句,打印出来的是文件名和行数等更加直观的信息
#include<stdlib.h>
#include<crtdbg.h>
(1)#include语句必须采用上文所示顺序。如果更改了顺序,所使用的函数可能无法正确工作
(2)如果有cpp文件无法看到这三行,以下函数就无效了,于是应该把这三行放到一个头文件里,确保每个cpp文件会调用到它
2.方法一:使用_CrtDumpMemoryLeaks()
intmain(intargc,char*argv[])
{
{newint;}
_CrtDumpMemoryLeaks();
return0;
}
output:
Detected memory leaks!
Dumping objects ->
{49} normal block at 0x00384DA8, 4 bytes long.
Data: < > CD CD CD CD
Object dump complete.
其内容包括:内存分配型号(在大括号内)、块类型(普通、客户端或 CRT)、十六进制形式的内存位置、以字节为单位的块大小、以字节为单位的块大小、前 16 字节的内容(十六进制)
注意:
(1)大括号的位置,如果不加{new int;},这块内存是等到main函数结束才泄漏的,而_CrtDumpMemoryLeaks()是在main函数里调用的,于是判断内存泄漏
classA
{
public:
int*Data;
A()
{
Data=newint;
}
~A()
{
deleteData;
}
};
intmain(intargc,char*argv[])
{
ATest;
_CrtDumpMemoryLeaks();
return0;
}
output:
Detected memory leaks!
Dumping objects ->
{49} normal block at 0x00384DA8, 4 bytes long.
Data: < > CD CD CD CD
Object dump complete.
(2)对于一些全局函数,如果初始化时申请了内存,到程序结束时候才释放,此函数会一直把新申请的内存当作泄漏来对待
ATest;
intmain(intargc,char*argv[])
{
_CrtDumpMemoryLeaks();
return0;
}
output:
Dumping objects ->
{49} normal block at 0x00384DA8, 4 bytes long.
Data: < > CD CD CD CD
Object dump complete.
2.方法二:在程序入口写几个语句,程序退出时,如果发现有内存泄漏,会自动在DEBUG OUTPUT窗口和DebugView中输出内存泄漏信息
inttmpFlag=_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);
tmpFlag|=_CRTDBG_LEAK_CHECK_DF;
_CrtSetDbgFlag(tmpFlag);
3.方法三:使用_CrtMemCheckpoint(),可以查出某程序段的内存泄漏情况
intmain(intargc,char*argv[])
{
CrtMemStates1,s2,s3;
_CrtMemCheckpoint(&s1);
newint;//程序段
_CrtMemCheckpoint(&s2);
if(_CrtMemDifference(&s3,&s1,&s2))_CrtMemDumpStatistics(&s3);
return0;
}
output:
bytes in 0 Free Blocks.
4 bytes in 1 Normal Blocks.
0 bytes in 0 CRT Blocks.
0 bytes in 0 Ignore Blocks.
0 bytes in 0 Client Blocks.
Largest number used: 0 bytes.
Total allocations: 4 bytes.
相关推荐
C++ 内存 泄露 检测器 对于一个c/c++程序员来说,内存泄漏是一个常见的也是令人头疼的问题。已经有许多技术被研究出来以应对这个问题
windows下c++内存泄露检测工具使用方windows下c++内存泄露检测工具使用方
C++实现内存泄漏检查
这里是一个简单的内存泄漏自动检查机制。只适用于单线程情况下。工作原理就是将已经分配的内存用一个双向链表串联起来,释放内存时从链表里删除。在程序退出时,将链表中未释放的内存打印出来。同时在内存块中保存...
内存检测代码,主要通过重载的方式检测已经实现的代码中是否有内存泄漏,详细细节见code,在这里不多作说明,毕竟空间不多啊,呵呵,一切尽在代码中
在 Linux 平台中调试 C-C++ 内存泄漏方法
VLD是一款用于VisualC++的免费内存泄漏检查工具。可以在codeproject.com网站上找到,相比其它的内存泄漏哦给你根据,他在检查内存泄漏的同事,还具有如下特点: 1) 可以得到内存泄漏点的调用堆栈,如果可以的话,...
C/C++程序内存泄漏检测,在编程中容易忽略的问题
一个非常好用的C++内存泄漏检测工具以及使用例子,可以方便地检测出开发的程序中内存泄漏情况,程序员必备工具之一。
几个内存泄漏的例子 new和delete要成对使用...经常看到一些C++方面的书籍中这样提及到内存泄漏问题,这样的说法的意思是比较明白,但对于初学C++程序员还是很难掌握,所以下面举几个反面的例子,希望对大家有帮助。
C内存管理内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍...本期专题将从内存管理、内存泄漏、内存回收这三个方面来探讨C++内存管理问题
本文从内存管理、内存泄漏、内存回收这三个方面来探讨C++内存管理问题。
用户只需将#include "vld.h"和#include "vldapi.h" 放在stdafx.h中,即可通过“输出”查看到自己哪里出现的内存泄漏。很方便也很实用。
AQtime,主要是介绍AqTime如何监控C++程序泄露并定位到C++程序的内和对象
浅谈C_C++内存泄漏及其检测工具, 对C/C++的内存泄露做了简洁的介绍, 并介绍了检测方法和工具.
可以检测出代码中的一些认为的申请的内存,而在程序结束未释放,导致程序一直在吃内存,检测内存异常
Visual Leak Detector是一款免费的、健全的、开源的Visual C++内存泄露检测系统。相比Visual C++自带的内存检测机制,Visual Leak Detector可以显示导致内存泄露的完整内存分配调用堆栈。 下载Visual Leak Detector...
C++内存泄漏检测原理的文档,包括代码,东东来自网络,我亲自整理,欢迎下载。
C++高手必过内存管理关,探讨C++内存回收,C++内存泄漏及其检测工具