0

私はこれらの構造を持っています:

typedef struct memory_slice {
    size_t startAdd; //Start of slice
    size_t dim; //Dim in bytes
    void *slice; //Chunk of memory
    struct memory_sclice *next; //Next element in list
} ms;

typedef struct heap_s {
    struct memory_slice *empty; //List of ptr to free memory
    struct memory_slice *used;
    heap_policy_t pol;
} heap_t;

コンストラクタとデストラクタとして機能する 2 つの関数を作成します。

heap_t *heapCreate (size_t heapSize) {
    heap_t *p = malloc(sizeof(heap_t));

    if (heapSize != 0) {
        p->empty = malloc(sizeof(ms)); //Only one chunk
        p->empty->slice = malloc (sizeof(heapSize));
        p->empty->dim = heapSize;
    } else {
        p->empty = malloc(sizeof(ms));
        size_t ap = 1024;
        p->empty->slice = malloc (sizeof(ap));
        p->empty->dim = ap;
    }

    p->empty->startAdd = 0;
    p->empty->next = NULL;
    p->used = NULL;
    p->pol = first_fit;

    return p;
}

//Destructor of struct
void heapDestroy (heap_t *h) {
    //Free all slices
    struct memory_sclice *app;

    while (h->empty != NULL) {
        free(h->empty->slice);
        app = h->empty;
        h->empty = h->empty->next;
        free(app);
    }

    while (h->used != NULL) {
        free(h->used->slice);
        app = h->used;
        h->used = h->used->next;
        //free(app->slice);
        free(app);
    }

    free(h); //Delete main structure
}

このコードは機能しますが、この「free(app->slice)」のようにメモリを解放できない方法がわかりません:

while (h->empty != NULL) {
        app = h->empty;
        free(app->slice);
        h->empty = h->empty->next;
        free(app);
    }

「無料(アプリ->スライス)」を使用して問題がどこにあるのか誰か教えてもらえますか??

4

3 に答える 3

1

提供されたコードには、への参照がいくつかありますstruct memory_cslice。それらはに変更する必要がありますstruct memory_slice。次のようなものを追加しない限り、コードはコンパイルされません。

typedef enum { first_fit, best_fit, worst_fit } heap_policy_t;

あなたが利用valgrindできるようになったことがありますか?

問題のある呼び出しが 2 つありますmalloc()(実際のコードでは隣接していません)。

p->empty->slice = malloc(sizeof(heapSize));
...
p->empty->slice = malloc(sizeof(ap));

いずれの場合も、 への引数sizeof()は typesize_tであるため、実際には 2 つのブロックは同じ量のスペースを割り当てており、おそらく 4 バイトまたは 8 バイトです。多くの場合、 ;sizeof()と一緒に使用するのが正しいです。malloc()これは正しくないケースの 1 つです。次のように書いた場合、コードを簡素化できます。

heap_t *heapCreate(size_t heapSize)
{
    heap_t *p = malloc(sizeof(heap_t));

    if (heapSize == 0)
        heapSize = 1024;
    p->empty = malloc(sizeof(ms));
    p->empty->slice = malloc(heapSize);
    p->empty->dim = heapSize;
    p->empty->startAdd = 0;
    p->empty->next = NULL;
    p->used = NULL;
    p->pol = first_fit;
    return p;
}

もちろん、malloc()失敗した場合を処理する必要があるため、次のように改善する必要があります。

heap_t *heapCreate(size_t heapSize)
{
    heap_t *p = malloc(sizeof(heap_t));
    if (p != 0)
    {
        if (heapSize == 0)
            heapSize = 1024;
        if ((p->empty = malloc(sizeof(ms))) == 0)
        {
            free(p);
            return 0;
        }
        if ((p->empty->slice = malloc(heapSize)) == 0)
        {
            free(p->empty);
            free(p);
            return 0;
        }
        p->empty->dim = heapSize;
        p->empty->startAdd = 0;
        p->empty->next = NULL;
        p->used = NULL;
        p->pol = first_fit;
    }
    return p;
}
于 2013-05-12T03:36:40.750 に答える
0

独自のおもちゃのメモリ マネージャーを作成する場合は、UNIX 関数 brk および sbrk を使用する必要があります :)

コードで free(app->slice) を呼び出した場所の特定のコンテキストを提供してくれれば、それが壊れるために答えるのがはるかに簡単になります。これは、free(app->slice) を実行してメモリを解放できるはずだからです。

于 2013-05-11T22:04:53.513 に答える
0

ここにタイプミスがあるためだと思います:

struct memory_sclice *app;

である必要がありますmemory_slice

現在、appは型memory_slicesliceはないため、メンバーではありません。

基本的に、定義のない構造体へのポインターがあります。(何らかの非常に奇妙な理由で、memory_sclice:V と呼ばれる構造体がそこにある場合を除きます。私は驚かれることでしょう。)

このエラーは本当にポップアップした唯一のものでしたか?

于 2013-05-11T21:52:26.317 に答える