用单链表实现的内存管理

转载 2013年12月03日 22:58:08

http://blog.csdn.net/csynyk/article/details/2861979

 

在C语言论坛中看了dgarc发表的一个贴子后,按要求写了一段代码,可以实现内存分配的管理,避免内存泄漏,欢迎各位测试,如遇bug,敬请指出,我将进行有针对性的改进,然后重新贴出来。

要求如下

    题目:监控应用程序的内存申请和释放 
     描述:
         不考虑多线程,使用动态单链表的方式进行操作,在应用程序申请内存时,需要把该内存节点信息插入链表进行记录,应用程序释放内存,把相应内存节点的信息从链表中删除,在应用程序退出时,如果链表仍然存在节点,说明存在内存泄露,应用程序不存在内存泄露,则链表为空。
MLCmalloc()  封装了malloc ,同时将信息插入链表操作
MLCfree()    封装了free ,同时将信息从链表中删除

程序代码:
    下列代码在满足题目要求的同时,增加了对泄漏空间的检测和释放功能。

#include <stdio.h>
#include <string.h>
#include <windows.h>


#define   _MC    1     // MLCmalloc()的标志
#define   _FE    0     // MLCfree()的标志
#define  _Check  -1    //检测内存的标志




typedef struct _Memory         //单向链表结构
{
	unsigned int address;
	struct _Memory *next;
}Mem, *LinkMem;

int MemoryContrl(size_t addr,char flag)  
{
	static Mem head;        //保存链表头     
	LinkMem tmp=head.next, node=&head ; 
	if( _MC==flag )         //增加链表节点
	{
		while(tmp)              
		{
			node=tmp;
			tmp=tmp->next;
		}
		node->next=(LinkMem)malloc(sizeof(Mem));
		if(node->next==NULL)
			return 1;   //分配失败!
		node=node->next;
		node->address=addr;
		node->next=NULL;
	}
	else if( _FE==flag)     //删除节点
	{
		while(tmp && (tmp->address!=addr))
		{
			node=tmp;
			tmp=tmp->next;
		}
		if(tmp==NULL)
			return -1;  //free地址出错!
		else
		{
			node->next=tmp->next;
			free(tmp);
		}
	}
	else                           //有泄漏返回地址,无则返回null
		return (int)( head.next? head.next->address :0 );  
	return 0;
}


///////////////内存分配//////////////////////


void *MLCmalloc(size_t size)   
{
	void *pMalc=malloc(size);
	if(pMalc==NULL)
		return NULL;
	else if(MemoryContrl((size_t)pMalc, _MC)==1)
	{
		free(pMalc);   //动态链建立失败时释放此次分配的空间
		return NULL;
	}       
	else
		return pMalc;
}

///////////////内存释放//////////////////////

void MLCfree(void *ptr)        
{
	if(MemoryContrl((size_t)ptr, _FE)==-1)
	{
		printf("%s/n","被释放的内存地址错误!");
		return ;
	}
	else
		free(ptr);
}



//////////检查泄漏//////////

size_t CheckLeak()   
{
	return (size_t)(MemoryContrl((size_t)0, _Check));
}


 

#include "mem.h"

int main()
{
	char **p=NULL;
	char *str="1234567890098765432";
	char *tmp,i;
	p=(char **)MLCmalloc(10*sizeof(char*));
	printf("分配p=%#x/n",p);
	for( i=0;i<10; i++)
	{
		p[i]=(char *)MLCmalloc(20*sizeof(char));
		sscanf(str,"%s",p[i]);
	}
	for(i=0; i<10; i++)
		printf("&p[%d]=%#x  *p[%d]=%s/n",i,p[i],i,p[i]);
	printf("释放p=%#x/n",p);   //不安正常顺序释放
	MLCfree(p);
	while((tmp=(char*)CheckLeak())!=0)  //检测是否有泄漏空间
	{
		MLCfree(tmp);               //释放检测到的泄漏空间
		printf("tmp=%#x/n",tmp);
	}
	return 0;

}


 

相关文章推荐

单片机的动态内存管理-一以链表为例

程序在运行时有时候会需要一个很大的空间去临时存储一些变量,如果一开始就分配一个很大的数组区的话,有可能会造成内存的浪费,有可能很长一段时间根本不需要这么大的内存,这就造成了一种情况,如果不分配这么大的...
  • ma57457
  • ma57457
  • 2016年10月13日 22:44
  • 2492

一个基于链表的内存管理方案

http://blog.csdn.net/dog250/archive/2010/06/11/5665256.aspx
  • wishfly
  • wishfly
  • 2011年02月25日 14:42
  • 1814

Windows内存管理(1)--分配内核内存 和 使用链表

1.      分配内核内存 Windows驱动程序使用的内存资源非常珍贵,分配内存时要尽量节约。和应用程序一样,局部变量是存放在栈空间中的。但栈空间不会像应用程序那么大,所以驱动程序不适合递归调用...

使用链表管理内存

使用链表管理内存的使用,这儿重新定义了 malloc,realloc,free函数,使用了mymalloc,myrealloc,myfree自己重定义了函数 mem.h #include ...

链表的C语言实现(含动态内存分配)

链表的C语言实现(含动态内存分配)上 链表的C语言实现之动态内存分配 一、为什么用动态内存分配  但我们未学习链表的时候,如果要存储数量比较多的同类型或同结构的数据的时候,总是使用一个数组。比如说我们...
  • 21aspnet
  • 21aspnet
  • 2004年10月22日 12:28
  • 11183

【C语言】 单链表的实现 用malloc实现的动态内存管理

链表是我们初学者经常接触到的数据结构,和顺序表相比,它节省了空间,在插入的时候节省了时间。 单链表每个节点由数据和指向下一个节点的指针构成。头部由一个head节点,尾部指针指向NULL。 如图所示...

单数组实现双向链表和内存管理(资源池)

单数组实现双向链表,链表分为 已使用部分和 空闲部分,通过两个变量记录头结点来标示。申请内存时从空闲部分把对应结点移入已使用部分,释放时相反。申请内存时是从Free空间里面顺序提取,所以该部分只需要使...

操作系统模拟内存管理实验,C语言链表实现,附源码

首先理解这几个概念1. 内存物理空间的划分 内存空间被动态的划分为若干个长度不相同的 物理段, 每个物理段由起始地址和长度确定。 2. 内存分配 以段为单位分配内存, 每个段在内存中占据...

内存管理(链表,指针操作,繁琐)

内存管理 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status ...
  • cs_zlg
  • cs_zlg
  • 2012年08月11日 10:55
  • 1020

C语言内存管理(初级)----链表

上一篇文章里实现了二维动态数组的创建和销毁,现在来看一个稍加复杂一点的实例:链表,读者需具有链表的基本知识,本文的链表实现与读者所熟知的实现有一些差异。     假定我们要写一个计算器程序,它接受一...
  • zhcosin
  • zhcosin
  • 2012年12月15日 22:21
  • 1521
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用单链表实现的内存管理
举报原因:
原因补充:

(最多只允许输入30个字)