单链表实现内存分配监控

原创 2013年12月04日 23:04:43

 

main.cpp

#include "oj.h"
#include <string.h>

//存放内存泄漏的地址
void* g_array[1024];

int main(int argc,char* argv[])
{
	memset(g_array,0,sizeof(g_array));

	void* pAddr = MLC_Malloc(4);

	void* pTest[4] = {0};

	pTest[0] = pAddr;

	int nNumber = 0;

	Check_mem(&nNumber,g_array);

	return 0;
}


 

oj.h

//2013/12/4 22:21
//oj上面的题目
//大致意思是这样的,封装内存的分配与释放,分配成功的内存放到链表中
//释放内存调用对应的释放函数。然后检测函数可以检测到是否有内存泄露

#include <stdio.h>

//内存申请的函数
void* MLC_Malloc(int nSizeof);

//内存释放函数
int MLC_Free(void* pAddr);

//检查是否有内存泄漏
void Check_mem(int *pNumber,void ** pArray);

//释放内存泄漏
void Free_leak();

typedef struct node 
{
	void* data;
	node* next;
}Node;

//链表相关操作
void InitNode();

void AddNode(void* pAddress);

void FreeNodeByAddress(void* pAddRess);


 

oj.cpp

#include "oj.h"
#include <malloc.h>

Node startNode;
bool bInitNode = false;

void* MLC_Malloc( int nSize )
{
	if (!bInitNode)
	{
		InitNode();
		bInitNode = true;
	}

	void* pTemp = malloc(sizeof(nSize));
	if ( NULL == pTemp)
	{
		return NULL;
	}

	AddNode(pTemp);

	return pTemp;
}

int MLC_Free( void* pAddr )
{
	FreeNodeByAddress(pAddr);
	return 0;
}

void Check_mem( int *pNumber,void ** pArray )
{
	*pNumber = 0;
	Node* pTemp = startNode.next;
	if ( NULL == pTemp)
	{
		return;
	}

	while( NULL != pTemp)
	{
		pArray[*pNumber] = pTemp->data;
		(*pNumber)++;
		pTemp = pTemp->next;
	}
}

void Free_leak()
{
	if ( NULL == startNode.next)
	{
		return;
	}
	Node* pTemp = startNode.next;
	if ( NULL == pTemp)
	{
		return;
	}

	while( NULL != pTemp)
	{
		Node* p = pTemp->next;

		free(p->data);
		free(p);
		pTemp = p;
	}
}

void InitNode()
{
	startNode.next = NULL;
}

void AddNode( void* pAddress )
{
	Node* pTemp = &startNode;

	while( NULL != pTemp->next)
	{
		pTemp = pTemp->next;
	}

	Node* pNew = (Node*)malloc(sizeof(Node));
	pNew->data = pAddress;
	pNew->next = NULL;

	pTemp->next = pNew;
}

void FreeNodeByAddress( void* pAddRess )
{
	Node* pTemp = &startNode;

	while( NULL != pTemp->next && pTemp->next->data != pAddRess)
	{
		pTemp = pTemp->next;
	}
	
	//p是要释放的节点
	Node* p = pTemp->next;
	pTemp->next = p->next;

	free(p->data);
	free(p);
}


 

动态内存分配--链表

  • 2015年11月28日 13:02
  • 324KB
  • 下载

动态内存分配(malloc/free)简单实现--隐式空闲链表

本文使用隐式空闲链表实现简单的动态内存分配。 动态内存分配器维护一个大块区域,也就是堆,处理动态的内存分配请求。分配器将堆视为一组不同大小的块的集合来维护,每个块要么是已分配的,要么是空闲的。 实...

系统内存分配的首次适应算法和最佳适应算法链表模拟实现

#include #include using namespace std; #define Free 0 //空闲状态 #define Busy 1 //已用状态 #define OK 1 ...

数据结构和算法C语言实现:链表的实现(基于动态内存分配)

1、链表是由称为节点的元素组成的序列。       每个节点包含两部分:1)、data(数据)部分,存放列表的一个元素。 2)next 部分,存放一个指针,指出包含下一列表元素的节点的位置。如果没有下...

OS模拟内存分配算法(链表处理)

  • 2009年06月13日 13:23
  • 11KB
  • 下载

高性能流媒体服务器-nebula之数据结构(6)--无节点内存分配的单、双链表

无内存分配的单链表和双链表的c++代码实现,由于不用内存分配给节点,效率很高,这stl中的list要高效得多,使用时要求每一个存储的节点包含一个Entry的实例,要存储节点必须在堆中分配内存。...

C语言之_动态内存分配、结构体指针、链表

1、动态内存分配 malloc free 1.1动态内存分配---自动内存分配 区别 int main(int argc,char *argv[]) { int a=10; ...

内存分配(1) — 空闲链表

Posted on六月 29, 2007byarrowpig1979内存分配是所有成功的库都要费大量心力去做好的事情,除非是对performance很高的需求,至少我现在在工作中很少需要自己来写内存分...

动态内存分配以及链表的基本操作

一、c/c++中的动态内存分配 1、在c中申请动态内存使用的是malloc函数,malloc函数位于stdlib.h头文件下,其返回类型是申请的同变量类型的指针。例如申请一个node类型结构体变量使...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:单链表实现内存分配监控
举报原因:
原因补充:

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