1. 程式人生 > >內存池簡易版 c語言

內存池簡易版 c語言

stat c語言 else next static ati style type ini

#ifndef X_MEMORY_H

#define X_MEMORY_H
#include <stdlib.h>
#include <stdio.h>
#include <memory.h>

typedef enum
{
    ErrorUnknown,
    NoError,
    ErrorInit
}XMemErrorCode;

#ifdef __cplusplus
extern "C" {
#endif

    
    int initMemory(int size);

    void* xmalloc(int size);

    
void xfree(void* data); #ifdef __cplusplus } #endif #endif
#include "xmemory.h"

typedef struct  
{
    void* pre;
    void* next;
    int size;
}stBlock;

static stBlock* head = NULL;

int initMemory(int size)
{
    stBlock* tail = NULL;
    char* memhead = (char*)malloc(size);    
    if(NULL == memhead)
        
return ErrorInit; memset(memhead, 0, size); head = (stBlock*)memhead; head->pre = NULL; head->next = memhead + size - sizeof(stBlock); head->size = 0; tail = head->next; tail->pre = head; tail->next = NULL; tail->size = 0; return NoError; }
void* xmalloc(int size) { stBlock* blk = head; stBlock* nblk = NULL; stBlock* tmpblk = NULL; char* ret = NULL; int ntry = 1; do { int validsize = (char*)blk->next - (char*)blk - sizeof(stBlock)*2 - blk->size; if(validsize >= size){ nblk = (stBlock*)((char*)blk+sizeof(stBlock)+blk->size); nblk->size = size; nblk->next = blk->next; nblk->pre = blk; blk->next = nblk; break; }else{ blk = blk->next; } } while (blk->next); if (NULL == nblk) { return NULL; } ret = (char*)nblk+sizeof(stBlock); memset(ret, 0, size); return ret; } void xfree(void* data) { stBlock* blk = head; stBlock* preblk = NULL; do { if ((char*)blk+sizeof(stBlock) == data) { preblk = blk->pre; preblk->next = blk->next; break; }else { blk = blk->next; } } while (blk); }

內存池簡易版 c語言