⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mymempool.c

📁 红黑树生成及应用的算法程序
💻 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 + -