《C语言》双链表——内存管理

《C语言》双链表——内存管理

Main.c

#define USING_MEMORY_MANAGE

#include "MemManage.h"
#include <time.h>

#define N 50

void main()
{
	srand((unsigned int)time(NULL));
	void* P_Addrs[N] = { NULL };

	for (int i = 0; i < N; i++)
	{
		P_Addrs[i] = malloc((rand() % 1024)*1024*100);
	}
	Show();

	free(P_Addrs[0]);
	free(P_Addrs[0]);
	free(P_Addrs[5]);
	free(P_Addrs[5]);
	free(P_Addrs[9]);
	free(P_Addrs[9]);

	//扩展内存
	Show();
	P_Addrs[1]=recalloc(P_Addrs[1], 4096);

	Show();

	system("pause");
}

MemManage.h

#pragma once 


#ifdef __cplusplus
extern "C"
{
#endif

#include <stdio.h>
#include <stdlib.h>


	typedef struct MemInfo
	{
		size_t MemSize;
		void* P_MemAddr;

		struct MemInfo* P_Pre;
		struct MemInfo* P_Next;
	}MemInfo;

	typedef struct MemManage
	{
		MemInfo* P_Head;
		MemInfo* P_Tail;
	}MemManage;

	MemManage G_MemList;

	//显示当前状态
	void Show();
	//添加节点
	void PushBack(MemInfo* P_NewNode);
	//查找节点
	MemInfo*FindNode(void* P_MemAddr);
	//删除节点
	void DeleteNode(void* P_MemAddr);
	
	//malloc
	void* MyMalloc(size_t MemSize, const char* FileName, const char* Function, unsigned int Number);
	//recalloc
	void* MyRecalloc(void* P_MemAddr, size_t MemSize, const char* File, const char* Function, unsigned int Number);
	//free
	void MyFree(void* P_MemAddr, const char* FileName, const char* Function, unsigned int Number);

#ifdef USING_MEMORY_MANAGE
#define malloc(MEMSIZE) MyMalloc(MEMSIZE,__FILE__,__FUNCTION__,__LINE__)
#define recalloc(MEMADDR,MEMSIZE) MyRecalloc(MEMADDR,MEMSIZE,__FILE__,__FUNCTION__,__LINE__)
#define free(MEMADDR) MyFree(MEMADDR,__FILE__,__FUNCTION__,__LINE__)
#endif
#ifdef __cplusplus
}
#endif

MemManage.c

#include "MemManage.h"



//显示当前状态
void Show()
{
	MemInfo* P_Bak = G_MemList.P_Head;
	unsigned int Counter = 0u;
	if (NULL == G_MemList.P_Head)
	{
		return;
	}

	while (NULL != P_Bak)
	{
		printf("%p\t%u\n", P_Bak->P_MemAddr, P_Bak->MemSize);
		Counter += P_Bak->MemSize;
		P_Bak = P_Bak->P_Next;
	}

	printf("\n合计使用内存:%u MB\n", Counter/1024/1024);
	puts("");
}

//添加节点
void PushBack(MemInfo* P_NewNode)
{

	if (NULL == G_MemList.P_Head&&NULL == G_MemList.P_Tail)
	{
		//没有节点的情况

		//头结点和尾节点一样
		G_MemList.P_Head = G_MemList.P_Tail = P_NewNode;
	}
	else
	{
		//改变后继
		G_MemList.P_Tail->P_Next = P_NewNode;
		//改变前驱
		P_NewNode->P_Pre = G_MemList.P_Tail;
		//重新定义尾指针
		G_MemList.P_Tail = P_NewNode;
	}
}

//查找节点
MemInfo*FindNode(void* P_MemAddr)
{
	MemInfo* P_Bak = G_MemList.P_Head;
	while (NULL != P_Bak)
	{
		if (P_MemAddr == P_Bak->P_MemAddr)
		{
			return P_Bak;
		}
		P_Bak = P_Bak->P_Next;
	}
	return NULL;
}

//删除节点
void DeleteNode(void* P_MemAddr)
{
	MemInfo* P_Res = FindNode(P_MemAddr);
	if (NULL != P_Res)
	{
		if (P_Res == G_MemList.P_Head)
		{
			//当“P_Res”等于头结点的情况
			G_MemList.P_Head = G_MemList.P_Head->P_Next;
		
			//首先释放用户申请的内存
			free(P_Res->P_MemAddr);
			//避免野指针
			P_Res->P_MemAddr = NULL;

			free(P_Res);
			P_Res = NULL;

		}
		else if(P_Res!=G_MemList.P_Head&&P_Res!=G_MemList.P_Tail)
		{

			//当“P_Res”在头节点和尾节点之间的情况

			P_Res->P_Pre->P_Next = P_Res->P_Next;
			P_Res->P_Next->P_Pre = P_Res->P_Pre;
			
			//首先释放用户申请的内存
			free(P_Res->P_MemAddr);
			//避免野指针
			P_Res->P_MemAddr = NULL;

			free(P_Res);
			P_Res = NULL;
		}
		else
		{
			G_MemList.P_Tail = G_MemList.P_Tail->P_Pre;
			G_MemList.P_Tail->P_Next = NULL;

			//首先释放用户申请的内存
			free(P_Res->P_MemAddr);
			//避免野指针
			P_Res->P_MemAddr = NULL;

			free(P_Res);
			P_Res = NULL;
		}
	}
}

//malloc
void* MyMalloc(size_t MemSize, const char* FileName, const char* Function, unsigned int Number)
{
	MemInfo* P_NewNode = (MemInfo*)malloc(sizeof(MemInfo));
	P_NewNode->P_Pre = P_NewNode->P_Next = NULL;
	P_NewNode->P_MemAddr = malloc(MemSize);
	P_NewNode->MemSize = MemSize;

	if (NULL == P_NewNode->P_MemAddr)
	{
		puts("-----内存申请失败-----");
		printf("源文件:%s\n", FileName);
		printf("函数名:%s\n", Function);
		printf("行号:%u\n", Number);
		return NULL;
	}

	PushBack(P_NewNode);
	return P_NewNode->P_MemAddr;
}

//recalloc
void* MyRecalloc(void* P_MemAddr, size_t MemSize, const char* FileName, const char* Function, unsigned int Number)
{
	MemInfo* P_Res = FindNode(P_MemAddr);
	if (NULL != P_Res)
	{
		P_Res->P_MemAddr = realloc(P_MemAddr, MemSize);
		if (NULL == P_Res->P_MemAddr)
		{
			puts("-----内存扩展失败-----");
			printf("源文件:%s\n", FileName);
			printf("函数名:%s\n", Function);
			printf("行号:%u\n", Number);
			return NULL;
		}
		P_Res->MemSize = MemSize;
	}
	return P_Res->P_MemAddr;
}
//free
void MyFree(void* P_MemAddr, const char* FileName, const char* Function, unsigned int Number)
{
	puts("-------释放内存-----");
	printf("源文件:%s\n", FileName);
	printf("函数名:%s\n", Function);
	printf("行号:%u\n", Number);
	DeleteNode(P_MemAddr);
}

猜你喜欢

转载自blog.csdn.net/baidu_41905806/article/details/84979624