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) ;
}
}