[英]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.