动态分配大型节点树的内存

时间:2013-05-19 14:18:10

标签: c++ c memory-management malloc calloc

我正在尝试创建一个以块为单位分配内存的函数,而不是为链接在一起的不同结构分配内存指针。

#define MEMSIZE 50*1024*1024*sizeof(char)
#include "globals.h"
void *AddBlock(void){
    memstart = (char*) calloc(1,MEMSIZE);
    if(memstart==NULL){
        printf("Hittade inte minne...:\n");
        getchar();
        throw 1;
    }
    memptr = memstart;
    return memstart;
}

void* GetSpace(size_t size){ //gör nytt block eller putta fram pekaren
                             //makes a new block or increases ptr

    void *tmp = NULL;//where the data should be stored
    if(( memptr+size+1 >= memstart+MEMSIZE) )
        tmp = AddBlock();
    else
    {
        tmp = memptr;
        memptr+=size;
    }
    return tmp;
}

void InitMem(void){ //init of memory globals
    AddBlock();
}

memptrmemstartextern char*memstart是阻止的开始,memptr就在您所在的位置。 InitMemmain开始时运行。

globals .h

extern char *memstart;
extern char *memptr;

globals .cpp

char *memstart;
char *memptr;

E.g。     struct Node * TheNode = GetSpace(sizeof(struct Node));

但代码工作非常糟糕,在程序中给出了很多故障。

有没有什么常见的方法可以做到这一点?当我使用malloc为每个结构分配内存时,有很多开销,这是一个巨大的交易,因为树由数百万个节点组成。

1 个答案:

答案 0 :(得分:1)

这段代码有问题

if(( memptr+size+1 >= memstart+MEMSIZE) )
    tmp = AddBlock();

因为它没有按尺寸推进memptr。