2013-05-19 1 views
0

메모리를 블록 단위로 할당하고 함께 연결된 서로 다른 구조체에 메모리 포인터를 할당 할 수있는 함수를 만들려고합니다.거대한 노드 트리에 대한 메모리 할당을 동적으로 수행합니다.

#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은 현재있는 위치입니다. InitMem은 시작시 main에서 실행됩니다.

전역가있는 .h

extern char *memstart; 
extern char *memptr; 

전역는

char *memstart; 
char *memptr; 

을 .CPP 일예 struct Node * TheNode = GetSpace (sizeof (struct Node));

하지만 코드는 실제로 작동하지 않아 프로그램에 많은 결함이 있습니다.

이렇게하는 일반적인 방법이 있습니까? malloc을 사용하여 각 구조체에 메모리를 할당 할 때 많은 오버 헤드가 생길 수 있습니다. 트리가 수백만 개의 노드로 구성되어 있기 때문에 엄청난 양의 문제입니다. 이 크기 memptr 진행되지 않기 때문에

+1

무엇이 질문입니까? 메모리 할당은 큰 주제이며 사용 사례도 정의하지 않았습니다. 우선, 개별 노드를 해제해야합니까? 다른 크기의 할당을 처리해야합니까? 일반적인 할당 크기는 얼마입니까? – delnan

+0

예 크기는 다르지만 해제 할 필요는 없습니다. 일반적인 할당 크기는 약 16 - 88 size_t입니다. – user1821987

+0

코드가 적당 해 보입니다. 당신이 처리하지 않는 유일한 방법은 정렬입니다. –

답변

1

코드의이 다리는 문제를

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

있습니다.

+0

결함을 제거해 주셔서 감사합니다. – user1821987

관련 문제