我正在尝试创建一个以块为单位分配内存的函数,而不是为链接在一起的不同结构分配内存指针。
#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();
}
memptr
和memstart
是extern char*
。 memstart
是阻止的开始,memptr
就在您所在的位置。
InitMem
在main
开始时运行。
globals .h
extern char *memstart;
extern char *memptr;
globals .cpp
char *memstart;
char *memptr;
E.g。 struct Node * TheNode = GetSpace(sizeof(struct Node));
但代码工作非常糟糕,在程序中给出了很多故障。
有没有什么常见的方法可以做到这一点?当我使用malloc为每个结构分配内存时,有很多开销,这是一个巨大的交易,因为树由数百万个节点组成。
答案 0 :(得分:1)
这段代码有问题
if(( memptr+size+1 >= memstart+MEMSIZE) )
tmp = AddBlock();
因为它没有按尺寸推进memptr。