码迷,mamicode.com
首页 > 其他好文 > 详细

内存管理(不涉及hash管理)

时间:2015-04-03 11:22:40      阅读:161      评论:0      收藏:0      [点我收藏+]

标签:

#include <iostream>
#include <malloc.h>
using namespace std;
struct MemNode
{
	char *pname;//文件名
	int line;//文件所在行
	int size;//内存泄漏大小
	MemNode *link;
};

MemNode *node=NULL;//定义的头节点.

void *operator new(size_t sz,const char *pname,int line)
{
	size_t space = sz + sizeof(MemNode);
	MemNode *p = (MemNode *)malloc(space);
	p->pname=const_cast<char *>(pname);
	p->line=line;
	p->link=NULL;
	p->size=sz;
	if(node==NULL)
	{
		node=p;
	}
	else
	{
		p->link=node;
		node=p;
	}
	p=p+1;
	return p;
}

void * operator new[](size_t sz,const char *pname,int line)
{
  size_t space = sz + sizeof(MemNode);
	MemNode *p = (MemNode *)malloc(space);
	
	p->pname=const_cast<char *>(pname);
	p->line=line;
	p->link=NULL;
	p->size=sz;
	if(node==NULL)
	{
		node=p;
	}	
  else
	{
		p->link=node;
		node=p;
	}
	p=p+1;
	return p;
}

/////////////////////////////////////
void operator delete[](void *p)
{
	MemNode *p1 = node;
	MemNode *p2 = p1->link;
	while(p1!=NULL)
	{
		if((node+1)==p)
		{	
		 free(node);
		 node=p2;
		 return;
		}
		if((p2+1)==p)
		{
			p1->link = p2->link;
			free(p2);
			return;
		}
		p1=p2;
		p2=p2->link;
	}
}
void operator delete(void *p)
{
	MemNode *p1 = node;
	MemNode *p2 = p1->link;
	while(p2!=NULL)
	{
		if((node+1)==p)
		{
			free(node);
			node=p2;
			return;
		}
		if((p2+1)==p)
		{
			 p1->link=p2->link;
			 free(p2);
			 return ;
		}
		p1 = p2;//1 2 
		p2 = p2->link;
	}
}

void cheak()
{
//	cout<<node->pname<<endl;
	if(node!=NULL)
	{
		cout<<node->pname<<endl;
		MemNode *p = node;
		while(p!=NULL)
		{
			cout<<"\t泄漏内存地址:"<<p<<"\t行号:"<<p->line<<"\t大小:"<<p->size<<endl;
			p = p->link;
		}
	}
	else
	{
			cout<<"没有内存泄漏!"<<endl;
	}
}

class text
{
	public:
	~text()
	{
		cheak();
	}
};//此处实现比调用atexit()好多了。
text text1;//次对象在程序结束之后析构,并且在调动析构函数的同时会自动调动内存检测函数,cheak();
#define new new(__FILE__,__LINE__)//这2个宏定义可以获取文件名以及行号。
int main()
{
	int *p = new int(10);
	double *q = new double(100.0);
	
	double *p1 = new double[10];
  	delete p;
  	delete q;
  	delete []p1;
	return 0;
}

内存管理(不涉及hash管理)

标签:

原文地址:http://blog.csdn.net/liuhuiyan_2014/article/details/44851435

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!