2013-11-03 58 views
1

我試圖釋放我所有的內存,並且我不確定我是否正確地爲結構*進行了操作。我的代碼片段:澄清釋放C中的內存

struct words { char word[40]; }; 
int main() { 
struct words* aList = malloc(2*sizeof(struct words)); 
// A text file is opened and each word is stored in a struct. I use an int variable to count how many times I've stored a word.// 
if(n >= 2*sizeof(struct words) { 
n = n*2; 
aList = realloc(n*sizeof(struct words)); 
//Once my program is done, at the end of my main.// 
free(aList); 

從我的C的理解(我只用它大約2個月),我在開始時創建結構數組的指針。然後我用realloc動態增加數組的大小。當我從內存中釋放aList時,它是否只釋放存儲在aList中的地址?

+2

這不是一個有效的'realloc()'調用。您錯過了原始指針。對於這個問題,'realloc()'或其他方面,有關'free()'做什麼以及它的要求是什麼的文檔[可以在這裏找到](http://en.cppreference.com/w/c/memory /自由)。 'realloc()'與它無關,儘管它的文檔是[同樣有趣的閱讀](http://en.cppreference.com/w/c/memory/realloc)。 – WhozCraig

+4

「我在開始時創建了一個結構指針數組。」 - 沒有。你已經創建了一個struct的srray。沒有指針數組,也不需要單獨釋放其元素。 –

+0

啊,對不起,我沒有直接粘貼我的代碼。我確實在我的代碼中正確實現了realloc(aList = realloc(aList,n * sizeof(struct words)) – ec10

回答

2
void* ptr = malloc(512); 

這爲您提供了包含512字節數據的內存塊。這並不意味着塊 512字節大,這意味着它包含512字節或更多。

通常,每個塊都有一個小的前綴,供分配器使用。

struct MemoryBlock { 
    size_t howBigWasIt; 
    char data[0]; // no actual size, just gives us a way to find the position after the size. 
}; 

void* alloc(size_t size) { 
    MemoryPool* pool = getMemoryPool(size); 
    MemoryBlock* block = getFirstPoolEntry(pool); 
    block->howBigWasIt = size; 
    return &block->data[0]; 
} 

static MemoryBlock blockForMeasuringOffset; 
void free(void* allocation) { 
    MemoryBlock* block = (MemoryBlock*)((char*)allocation) - sizeof(MemoryBlock)); 
    MemoryPool* pool = getMemoryPool(block->howBigWasIt); 
    pushBlockOntoPool(pool, block); 
} 

然後明白,realloc的是爲新的大小分配一個新的塊,在數據複製和釋放老的分配來實現。

所以你不能釋放的亞分配的分配:

int* mem = malloc(4 * sizeof(int)); 
free(int + 3); // invalid 

但是。

int i = 0; 
int** mem = malloc(4 * sizeof(int*)); 
mem[0] = malloc(64); 
mem[1] = alloca(22); // NOTE: alloca - this is on the stack. 
mem[2] = malloc(32); 
mem[3] = &i; // NOTE: pointer to a non-allocated variable. 

您負責免費()在這裏的每個分配。

// mem[3] was NOT an malloc 
free(mem[2]); 
// mem[1] was NOT an malloc 
free(mem[0]); 
free(mem); 

但這是一個匹配分配與釋放的問題。

+0

Ouch - 謝謝Soren :) – kfsone