《C語言》單鏈表——記憶體管理
阿新 • • 發佈:2018-12-08
《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);
}
}