内存池的学习

1)代码如下:

//检测内存泄露的方法:自定义malloc和free
//内存池难点:不确定分配和释放的时机;
//注意页和块的关系->: 1page=128count;
//头插法建立单链表完整代码
#include 
#include 
#include
#include
#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

你可能感兴趣的:(学习)