簡體   English   中英

C指針,可用內存

[英]C pointers, free memory

我有這些結構:

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;

我制作了兩個用作構造函數和析構函數的函數:

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

有人可以使用“ free(app-> slice)”告訴我問題出在哪里嗎?

提供的代碼具有對struct memory_cslice的幾個引用; 那些需要更改為struct memory_slice 除非添加以下內容,否則代碼不會編譯:

typedef enum { first_fit, best_fit, worst_fit } heap_policy_t;

您有可用的valgrind嗎?

malloc()有兩個有問題的調用(在實際代碼中不相鄰):

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

在每種情況下, sizeof()的參數的類型均為size_t ,因此實際上兩個塊分配的空間量相同,可能為4個字節或8個字節。 通常將sizeof()malloc()一起使用是正確的; 這是不正確的情況之一。 如果您編寫了以下代碼,則可以簡化代碼:

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

我相信這是因為您在這里有錯別字:

struct memory_sclice *app;

應該是memory_slice

當前, app的類型不是memory_slice ,因此slice不是成員。

基本上,您有一個指向沒有定義的結構的指針。 (除非出於某些非常奇怪的原因,您在那里有一個名為memory_sclice :V的結構。我會感到驚訝。)

這個錯誤真的是唯一彈出的錯誤嗎?

如果要構建自己的玩具內存管理器,則應使用unix函數brk和sbrk :)

如果您為我們提供了代碼中調用free(app-> slice)的特定上下文(以使其中斷),肯定會容易回答很多。 這是因為您應該可以通過執行free(app-> slice)來釋放內存。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM