自己实现简易的内存泄露检测工具VLD

有一个很著名的内存泄露检测工具Visual leak detected想必大家都不陌生,但今天我们可以自己写一个简易版的。哈哈,自己动手,丰衣足食有木有!!!

它的原理就是我们重载了操作符new和delete,当用new开辟空间的时候,就讲这块空间串到我们定义的结构体MEMNode形成的链表中,(这是老师的写法,在main程序结束时,用check_vld()函数检测有没有内存泄露)但我觉得,如果我们动态开辟了一个对象,在它的析构函数里用delete释放的话,这种方法就不太可行。因为析构函数只有到return时才会被调用(在check_vld()函数之前)。检测结果就不准确。由此我想到,可以将这个结构体该为C++中的类class MEMNode,并将其指针也封装为一个类PMEMNode,然后定义一个PMEMNode的全局静态成员(它会在主函数之前被构造,主函数结束后析构)。并将check_vld()的代码放在他的析构函数中。

废话不多说,代码在下面:

vld.h:

#pragma once

#include <iostream>
using namespace std;

class MemNode {
	friend void* operator new(size_t sz, char *filename, int line);
public:
	MemNode(int s = 0,char *pf = NULL, int l = 0,class MemNode *pl=NULL)
		:size(s),file(pf),line(l),link(pl)
	{}
	~MemNode()
	{}
	void set(int sz, char *pf, int l, class MemNode *pl)
	{
		size = sz;
		file = pf;
		line = l;
		link = pl;
	}
	void setlink(MemNode *pl)
	{
		link = pl;
	}
	int getsize()
	{
		return size;
	}
	char *getfile()
	{
		return file;
	}
	int getline()
	{
		return line;
	}
	MemNode *getlink()
	{
		return link;
	}
private:
	int size;
	char *file;
	int line;
	class MemNode *link;
};

void check_vld();

class pMemNode {
public:
	pMemNode(MemNode *ptr=NULL):p(ptr){}
	~pMemNode()
	{
		check_vld();
	}
	MemNode *getptr()
	{
		return p;
	}
	void setptr(MemNode *ptr)
	{
		p = ptr;
	}
private:
	MemNode *p;
};

static pMemNode _AfxMem;

void* operator new(size_t sz,char *filename,int line)
{
	void *result=NULL;
	int total_size = sz + sizeof(MemNode);
	MemNode *p = new MemNode[total_size];
	p->set(sz, filename, line, NULL);
	if (_AfxMem.getptr() == NULL)
	{
		_AfxMem.setptr(p);
	}
	else
	{
		p->setlink(_AfxMem.getptr());
		_AfxMem.setptr(p);
	}
	result = _AfxMem.getptr()+1;
	return result;
}

void operator delete(void *ptr)
{
	if(_AfxMem.getptr()==NULL)
	{
		return;
	}
	if(ptr==NULL)
	{
		return;
	}
	MemNode *p;
	if (_AfxMem.getptr()+1 == ptr)
	{
		p = _AfxMem.getptr();
		_AfxMem.setptr(p->getlink());
		delete p;
	}
	else
	{
		p = _AfxMem.getptr();
		while (p->getlink() != NULL && p->getlink()+1!=ptr)
		{
			p = p->getlink();
		}
		if (p->getlink() != NULL)
		{
			MemNode *q = p->getlink();
			p->setlink(q->getlink());
			delete q;
		}
	}
}

void check_vld()
{
	if (_AfxMem.getptr() == NULL)
	{
		cout << "No memory Leaks detected." << endl;
	}
	else
	{
		MemNode *p = _AfxMem.getptr();
		cout << "WARNING: Visual Leak Detector detected memory leaks!" << endl;
		while (p != NULL)
		{
			printf("At %p: %d Bytes\n", p + 1, p->getsize());
			printf("file: %s, line: %d\n", p->getfile(), p->getline());
			p = p->getlink();
		}
	}
}

Main.cpp:

#include <iostream>
#include <string>
#include "vld.h"
using namespace std;

class Test
{
public:
	Test(char *str)
	{
		int a = strlen(str) + 1;
		ch = new(__FILE__, __LINE__) char[a];
		//strcpy(ch, str);
	}
	~Test()
	{
		delete[]ch;
		ch = NULL;
	}
private:
	char *ch;
	int a;
	double b;
	char c;
};

int main()
{
	//VLD vld;
	int a = 10;
	Test t("hello");
	//int *p = new(__FILE__,__LINE__) int(10);
	//double *q = new(__FILE__,__LINE__) double(12.34);
	Test *s = new(__FILE__,__LINE__) Test("hello");

	//delete p;
	//delete q;
	//check_vld();
	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-06 11:54:00

自己实现简易的内存泄露检测工具VLD的相关文章

内存泄露检测工具——LeakCanary

很简单:我们不是创建服务不是为了赚钱:我们赚钱是为了提供更好的服务.我们认为这才是做事的态度. 学习使用Java的同学都应该知道,Java的JVM给我们提供的垃圾回收机制是极为好用的.但是我们也很清楚,垃圾回收机制不是万能的,使用不当很容易造成内存泄露.之前我们也介绍过Java中常用的内存泄露检测工具MAT,目前Java程序最常用的内存分析工具应该是MAT(Memory Analyzer Tool),它是一个Eclipse插件,同时也有单独的RCP客户端. 不熟悉MAT的同学,或者对Java垃圾

vld,Bounds Checker,memwatch,mtrace,valgrind,debug_new几种内存泄露检测工具的比较

概述 内存泄漏(memory leak)指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况,在大型的.复杂的应用程序中,内存泄漏是常见的问题.当以前分配的一片内存不再需要使用或无法访问时,但是却并没有释放它,这时就出现了内存泄漏.尽管优秀的编程实践可以确保最少的泄漏,但是根据经验,当使用大量的函数对相同的内存块进行处理时,很可能会出现内存泄漏. 内存泄露可以分为以下几类:1. 常发性内存泄漏.发生内存泄漏的代码会被多次执行到,每次被执行的时候都会导致一块内存泄漏.2. 偶发性内存泄漏.发生

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

初识Visual Leak Detector 灵活自由是C/C++语言的一大特色,而这也为C/C++程序员出了一个难题.当程序越来越复 杂时,内存的管理也会变得越加复杂,稍有不慎就会出现内存问题.内存泄漏是最常见的内存问题之一.内存泄漏如果不是很严重,在短时间内对程序不会有太大的 影响,这也使得内存泄漏问题有很强的隐蔽性,不容易被发现.然而不管内存泄漏多么轻微,当程序长时间运行时,其破坏力是惊人的,从性能下降到内存耗尽,甚 至会影响到其他程序的正常运行.另外内存问题的一个共同特点是,内存问题本身

Linux下C++内存泄露检测工具

下载安装:http://blog.csdn.net/wanglin754/article/details/7194145 下载地址:http://www.valgrind.org/downloads/current.html#current 安装valgrind tar jxvf valgrind-3.7.0.tar.bz2             注意这里的参数里加了j,表示有bz2属性 cd valgrind-3.7.0 ./configure make make install make

C程序内存泄露检测工具

今天给大家带来一款检测C程序内存泄露的一款实用工具--memwatch memwatch简介 MEMWATCH 由 Johan Lindh 编写,是一个开放源代码 C 语言内存错误检测工具.只要在代码中添加一个头文件并在 gcc 语句中定义了 MEMWATCH 之后,您就可以跟踪程序中的内存泄漏和错误了.MEMWATCH 支持 ANSI C,它提供结果日志记录,能检测双重释放(double-free).错误释放(erroneous free).没有释放的内存(unfreed memory).溢出

内存泄漏检测工具VLD在VS2010中的使用举例

Visual LeakDetector(VLD)是一款用于Visual C++的免费的内存泄露检测工具.它的特点有:(1).它是免费开源的,采用LGPL协议:(2).它可以得到内存泄露点的调用堆栈,可以获取到所在文件及行号:(3).它可以得到泄露内存的完整数据:(4).它可以设置内存泄露报告的级别. 默认情况下,只有在Debug模式下才会启用VLD的功能. 在使用的时候只要将VLD的头文件和lib文件放在工程文件中即可. 在需要检测内存泄露的源文件中添加#include "vld.h"

内存泄露检测工具

VS2008的内存泄露检测功能有限,使用也有些局限性.今天因工作时间紧迫,工程繁琐,我最终选择了VLD(Visual Leak Detector).这个工具使用起来十分简单,只需要: (1)下载安装vld.安装过程中可以发现vld安装向导提示关闭VS2008同时还将vld的头文件include目录路径.vld的库文件lib目录设置好了,简直太贴心.vld下载地址:http://vld.codeplex.com/ (2)在待检测的工程中添加头文件#include "vld.h"(我添加在

memwatch内存泄露检测工具

工具介绍 官网 http://www.linkdata.se/sourcecode/memwatch/ 其功能如下官网介绍,挑选重点整理: 1. 号称功能: 内存泄露检测 (检测未释放内存, 即 动态内存开辟未释放的情况) 2. 检测 多次调用free, 和 free 错误地址 3. 检测内存访问的 上越界 和 下越界 4. 检测对野指针进行的写操作 其他内存检测工具有 mtrace valgrind 参考 http://www.cnblogs.com/honglihua8688/p/37279

内存泄露检测工具(25款)

1.     ccmalloc-Linux和Solaris下对C和C++程序的简单的使用内存泄漏和malloc调试库. 2.     Dmalloc-Debug Malloc Library. 3.     Electric Fence-Linux分发版中由Bruce Perens编写的malloc()调试库. 4.     Leaky-Linux下检测内存泄漏的程序. 5.     LeakTracer-Linux.Solaris和HP-UX下跟踪和分析C++程序中的内存泄漏. 6.