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();
}

memptrmemstartですextern char*memstartはブロックの始まりであり、現在のmemptr場所です。 InitMem起動時に実行されmainます。

グローバル .h

extern char *memstart;
extern char *memptr;

グローバル .cpp

char *memstart;
char *memptr;

例 struct Node* TheNode = GetSpace(sizeof(struct Node));

しかし、コードは非常にうまく機能せず、プログラムに多くの不具合が発生します。

これを行う一般的な方法はありますか?malloc を使用して各構造体にメモリを割り当てると、多くのオーバーヘッドが発生します。これは、ツリーが数百万のノードで構成されているため、非常に大きな問題です。

4

1 に答える 1

1

このコードには問題があります

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

memptr をサイズで進めていないためです。

于 2013-05-19T15:56:58.183 に答える