1)代码如下:
//检测内存泄露的方法:自定义malloc和free
//内存池难点:不确定分配和释放的时机;
//注意页和块的关系->: 1page=128count;
//头插法建立单链表完整代码
#include <memory>
#include <string.h>
#include<stdio.h>
#include<stdlib.h>
#define MEM_PAGE_SIZE 0x1000 //4k
//分配4K大小的内存池区域,
typedef struct mempool_t
{
size_t block_size; //每一块的大小,大小暂定为32byte;
int free_count; //多少块,4K/32 = 128;
void* mem; //指向内存块开始的位置;
void* ptr; //下一次分配的位置
}mempool_t;
void* _malloc(mempool_t* mp,size_t size)
{
printf("malloc\r\n");
if(!mp || mp->free_count == 0) return NULL;
if(mp->block_size < size) return NULL;
void* ptr = mp->ptr;
mp->ptr = *(char**)ptr;
mp->free_count--;
return ptr;
}
void _free(mempool_t* mp,void* ptr)
{
if(!mp) return;
*(char**)ptr = (char*)mp->ptr;
mp->ptr = ptr;
printf("free\r\n");
}
int memp_init(mempool_t* mp,size_t block_size) //每一个block_size为32byte;
{
if(!mp) return -1;
{
memset(mp,0,sizeof(mempool_t));
}
mp->mem = malloc(MEM_PAGE_SIZE);
mp->block_size = block_size;
mp->free_count = MEM_PAGE_SIZE/block_size;
if(!mp->mem) return -1; //分配失败,返回-1;
mp->ptr = mp->mem; //分配一块,往后指;分配一块,往后指;第一次指向的是第一个block;
//下面代码的功能:在初始化中,把一个block(32byte)的前4个字节作为链表地址,把整个4K的内存串起来一样;
char*ptr = (char*)mp->ptr;
for(int i = 0; i < mp->free_count; i++)
{
*(char**)ptr = ptr + block_size;
ptr += block_size;
}
*(char**)ptr = NULL;
return 0;
}
#define malloc(mp,size) _malloc(mp,size)
#define free(mp,ptr) _free(mp,ptr)
int main()
{
mempool_t mp;
memp_init(&mp,32);
void* p1 = malloc(&mp,5);
printf("p1---> %p\r\n",p1);
void* p2 = malloc(&mp,10);
printf("p2---> %p\r\n",p2);
void* p3 = malloc(&mp,15);
printf("p3---> %p\r\n",p3);
void* p4 = malloc(&mp,20);
printf("p4---> %p\r\n",p4);
free(&mp,p1);
printf("mp.ptr ---> %p\r\n",mp.ptr);
free(&mp,p3);
printf("mp.ptr ---> %p\r\n",mp.ptr);
void* p5 = malloc(&mp,25);
printf("p5---> %p\r\n",p5);
void* p6 = malloc(&mp,30);
printf("p6---> %p\r\n",p6);
return 0;
}
输出结果如下:
malloc
p1---> 0x560ec909be70
malloc
p2---> 0x560ec909be90
malloc
p3---> 0x560ec909beb0
malloc
p4---> 0x560ec909bed0
free
mp.ptr ---> 0x560ec909be70
free
mp.ptr ---> 0x560ec909beb0
malloc
p5---> 0x560ec909beb0
malloc
p6---> 0x560ec909be70