📄 mymempool.c
字号:
/*
*
*mymempool.c 内存池 diablo
*
*/
#include <stdlib.h>
#include <memory.h>
#include <string.h>
#include <stdio.h>
#include <assert.h>
#include "mymempool.h"
typedef struct __mymempool_t
{
mymalloc malloc_fun;
myfree free_fun;
}mymempool_t;
#ifdef MEM_LEAK_CHECK
static void add_to_meminfo_list(const char * file, const int line, const void * ptr);
static void del_from_meminfo_list(const void * ptr);
static void meminfo_report();
#endif
/*
*
*构造内存池
*
*/
HMYMEMPOOL MyMemPoolConstruct(mymalloc malloc_helper, myfree free_helper)
{
mymempool_t * mp = NULL;
assert(malloc_helper && free_helper);
mp = (mymempool_t *)malloc(sizeof(*mp));
assert(mp);
mp->malloc_fun = malloc_helper;
mp->free_fun = free_helper;
return (HMYMEMPOOL)mp;
}
/*
*
*销毁内存池
*
*/
void MyMemePoolDestruct(HMYMEMPOOL hm)
{
mymempool_t * mp = (mymempool_t *)hm;
assert(mp);
free(mp);
}
/*
*
*分配内存
*
*/
#ifdef MEM_LEAK_CHECK
void * MemPoolMalloc(HMYMEMPOOL hm,size_t size, char * file, int line)
#else
void * MyMemPoolMalloc(HMYMEMPOOL hm,size_t size)
#endif
{
mymempool_t * mp = (mymempool_t *)hm;
void * ptr = NULL;
if(mp)
ptr = (*mp->malloc_fun)(size);
else
ptr = malloc(size);
#ifdef MEM_LEAK_CHECK
//添加到内存分配表
add_to_meminfo_list(file, line, ptr);
#endif
return ptr;
}
/*
*
*释放内存
*
*/
void MyMemPoolFree(HMYMEMPOOL hm, void * ptr)
{
mymempool_t * mp = (mymempool_t *)hm;
#ifdef MEM_LEAK_CHECK
//从内存分配表中删除
del_from_meminfo_list(ptr);
#endif
if(mp)
(*mp->free_fun)(ptr);
else
free(ptr);
}
#ifdef MEM_LEAK_CHECK
/*
*
*内存分配报告
*
*/
void MyMemPoolMemReport()
{
meminfo_report();
}
static struct __mymeminfo
{
char file[64];
int line;
void * ptr;
struct __mymeminfo * next;
struct __mymeminfo * prev;
} * head_meminfo_list = NULL;
static void add_to_meminfo_list(const char * file, const int line, const void * ptr)
{
//todo加锁
struct __mymeminfo * info = (struct __mymeminfo *)malloc(sizeof(*info));
memset(info, 0, sizeof(*info));
strncpy(info->file, file, sizeof(info->file));
info->line = line;
info->ptr = (void *)ptr;
info->next = head_meminfo_list;
if(head_meminfo_list)
head_meminfo_list->prev = info;
head_meminfo_list = info;
//todo解锁
}
static void del_from_meminfo_list(const void * ptr)
{
//todo加锁
struct __mymeminfo * info = head_meminfo_list;
while(info)
{
if(ptr != info->ptr)
{
info = info->next;
continue;
}
if(info->prev)
info->prev->next = info->next;
if(info->next)
info->next->prev = info->prev;
if(info == head_meminfo_list)
head_meminfo_list = info->next;
free(info);
break;
}
//todo解锁
}
static void meminfo_report()
{
struct __mymeminfo * info = head_meminfo_list;
int leak_count = 0;
printf("\n======== mem leak report begin ========\n");
while(info)
{
printf("[%s:%d] %x\n", info->file, info->line, info->ptr);
info = info->next;
leak_count ++;
}
printf("mem leak %d\n", leak_count);
printf("======== mem leak report end ==========\n\n");
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -