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) ;
void * MyMalloc ( size_t MemSize, const char * FileName, const char * Function, unsigned int Number) ;
void * MyRecalloc ( void * P_MemAddr, size_t MemSize, const char * File, const char * Function, unsigned int Number) ;
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)
{
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_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 ;
}
}
}
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;
}
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;
}
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) ;
}