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

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

Main.c

#define SAFE_MEMORY

#include "MemManage.h"
#include <time.h>
#define N 10

void main()
{

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

	for (int i = 0; i < N; i++)
	{
		P_Addr[i] = malloc(rand() % 2048);
	}
	Show(P_Memory);

	free(P_Addr[0]);
	free(P_Addr[0]);
	free(P_Addr[0]);
	free(P_Addr[5]);
	free(P_Addr[9]);
	
	Show(P_Memory);

	system("pause");
}

MemManage.h

#pragma once 


#ifdef __cplusplus
extern "C"
{
#endif

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

#ifdef SAFE_MEMORY
#define malloc MyMalloc
#define recalloc MyReCalloc
#define free MyFree
#endif

	typedef struct MemoryInfo
	{
		void* P_MemAddr;
		unsigned int MemSize;
	}MemoryInfo;

	typedef struct MemManage
	{
		MemoryInfo* P_MemInfo;
		struct MemManage* P_Next;
	}MemManage;

	MemManage* P_Memory;

	//初始化节点
	void InitNode(MemManage* P_Node);
	//显示链表状态
	void Show(MemManage* P_Head);
	//添加节点(添加内存)
	void Append(MemManage** PP_Head, MemoryInfo* P_MemInfo);
	//查找节点
	MemManage* FindNode(MemManage* P_Head, void* P_Addr);
	//修改节点
	void Modification(MemManage* P_Head, void* P_Addr, MemoryInfo* P_NewMem);
	//删除节点
	void DeleteNode(MemManage** PP_Head, MemoryInfo* P_DelAddr);
	//分配内存
	void* MyMalloc(size_t MemSize);
	//扩展内存
	void* MyReCalloc(void* P_OldAddr, size_t NewSize);
	//释放内存
	void MyFree(void* P_Addr);

#ifdef __cplusplus
}
#endif

MemManage.c

#include "MemManage.h"



//初始化节点
void InitNode(MemManage* P_Node)
{
	if (NULL != P_Node)
	{
		P_Node->P_MemInfo = NULL;
		P_Node->P_Next = NULL;
	}

}

//显示链表状态
void Show(MemManage* P_Head)
{
	if (NULL == P_Head)
	{
		puts("");
		return;
	}
	else
	{
		printf("%p\t%p\t%p\t%u\n", P_Head, P_Head->P_Next, P_Head->P_MemInfo->P_MemAddr, P_Head->P_MemInfo->MemSize);
		Show(P_Head->P_Next);
	}
}

//添加节点(添加内存)
void Append(MemManage** PP_Head, MemoryInfo* P_MemInfo)
{
	MemManage* P_New = (MemManage*)malloc(sizeof(MemManage));
	InitNode(P_New);
	P_New->P_MemInfo = P_MemInfo;

	if (NULL == *PP_Head)
	{
		*PP_Head = P_New;
	}
	else
	{
		MemManage* P_Bak = *PP_Head;
		while (NULL != P_Bak->P_Next)
		{
			P_Bak = P_Bak->P_Next;
		}
		P_Bak->P_Next = P_New;
	}
}

//查找节点
MemManage* FindNode(MemManage* P_Head, void* P_Addr)
{
	if (NULL == P_Head || NULL == P_Addr)
	{
		return NULL;
	}
	else
	{
		while (NULL != P_Head)
		{

			if (P_Addr == P_Head->P_MemInfo->P_MemAddr)
			{
				return P_Head;
			}
			P_Head = P_Head->P_Next;
		}
	}
	return NULL;
}

//修改节点(扩展内存)
void Modification(MemManage* P_Head, void* P_Addr, MemoryInfo* P_NewMem)
{
	if (NULL != P_Head)
	{
		MemManage* P_Res = FindNode(P_Head, P_Addr);
		if (NULL != P_Res)
		{
			P_Res->P_MemInfo = P_NewMem;
		}
	}

}

//删除节点(释放内存)
void DeleteNode(MemManage** PP_Head, MemoryInfo* P_DelAddr)
{
	if (NULL != *PP_Head)
	{
		MemManage*P_Res = FindNode(*PP_Head, P_DelAddr->P_MemAddr);
		if (NULL != P_Res)
		{
			if (P_Res == *PP_Head)
			{
				*PP_Head = (*PP_Head)->P_Next;

				free(P_Res->P_MemInfo->P_MemAddr);
				P_Res->P_MemInfo->P_MemAddr = NULL;
				free(P_Res);
				P_Res = NULL;
			}
			else
			{
				MemManage* P_Bak = *PP_Head;
				while (P_Bak->P_Next != P_Res)
				{
					P_Bak = P_Bak->P_Next;
				}

				free(P_Res->P_MemInfo->P_MemAddr);
				P_Res->P_MemInfo->P_MemAddr = NULL;
				P_Bak->P_Next = P_Res->P_Next;
				free(P_Res);
				P_Res = NULL;
			}
		}
	}
}

//分配内存
void* MyMalloc(size_t MemSize)
{
	MemoryInfo* P_New = (MemoryInfo*)malloc(sizeof(MemoryInfo));
	P_New->MemSize = MemSize;
	P_New->P_MemAddr = malloc(MemSize);
	Append(&P_Memory, P_New);

	return P_New->P_MemAddr;
}

//扩展内存
void* MyReCalloc(void* P_OldAddr, size_t NewSize)
{
	MemoryInfo* P_New = (MemoryInfo*)malloc(sizeof(MemoryInfo));
	P_New->MemSize = NewSize;
	P_New->P_MemAddr = realloc(P_OldAddr, NewSize);
	Modification(P_Memory, P_OldAddr, P_New);

	return P_New->P_MemAddr;
}

//释放内存
void MyFree(void* P_Addr)
{
	MemManage* P_Res = FindNode(P_Memory, P_Addr);
	if (NULL != P_Res)
	{	
		DeleteNode(&P_Memory, P_Res->P_MemInfo);
	}
}

猜你喜欢

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