用单链表实现的内存管理

转载 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;

}


 

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

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

链表实现动态内存管理

#include #include //记录分配内存大小和地址 struct MEM{ void *p; int size; }; typedef struct MEM * ElementType...
  • wmaoshu
  • wmaoshu
  • 2015年11月02日 22:37
  • 376

使用链表管理内存

使用链表管理内存的使用,这儿重新定义了 malloc,realloc,free函数,使用了mymalloc,myrealloc,myfree自己重定义了函数 mem.h #include ...
  • liuguangsh
  • liuguangsh
  • 2016年07月28日 10:09
  • 777

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

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

单链表----java语言实现

节点   数据域:存放数据   指针域:存放下一个数据的地址 1、常用操作   查找   插入   删除 查找: (1)按照索引查找index位置上的节点:从头节点head开始依次向下找到第index...
  • snow_7
  • snow_7
  • 2016年06月07日 15:43
  • 691

用单链表实现通讯录

/***************************************************************************************************...
  • lbd321
  • lbd321
  • 2016年12月09日 19:51
  • 1149

单链表实现一个栈

单链表实现的一个栈,只实现了栈的主要功能:push pop
  • nrj
  • nrj
  • 2014年10月12日 21:34
  • 1219

用单链表实现一个队列或一个栈的出入队和出入栈操作

1.用一单链表L实现一个栈,要求PUSH和POP操作的时间仍为O(1). 入栈操作相当于插入操作。出栈相当于删除操作。代码如下: //时间复杂度为O(1)的用单链表实现入栈出栈操作 #incl...
  • z84616995z
  • z84616995z
  • 2014年02月18日 19:00
  • 2405

单链表的应用———简单的通讯录

本人初学数据结构,代码还不够完善,还望各位大神,可以指点一二。#include //建立通讯录 #include #include typedef struct Node{ char n...
  • x_zhaohu
  • x_zhaohu
  • 2015年04月21日 23:08
  • 2533

在单链表上实现插入排序

问题:给单链表排序(升序排列,要保持稳定性),要求通过改变结点的next指针从而改变结点的位置,而不是只交换结点的值来使得其有序!时间复杂度为O(N^2),空间复杂度为O(1)。...
  • Jacketinsysu
  • Jacketinsysu
  • 2016年09月17日 20:10
  • 3852
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用单链表实现的内存管理
举报原因:
原因补充:

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