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);
但這是一個匹配分配與釋放的問題。
這不是一個有效的'realloc()'調用。您錯過了原始指針。對於這個問題,'realloc()'或其他方面,有關'free()'做什麼以及它的要求是什麼的文檔[可以在這裏找到](http://en.cppreference.com/w/c/memory /自由)。 'realloc()'與它無關,儘管它的文檔是[同樣有趣的閱讀](http://en.cppreference.com/w/c/memory/realloc)。 – WhozCraig
「我在開始時創建了一個結構指針數組。」 - 沒有。你已經創建了一個struct的srray。沒有指針數組,也不需要單獨釋放其元素。 –
啊,對不起,我沒有直接粘貼我的代碼。我確實在我的代碼中正確實現了realloc(aList = realloc(aList,n * sizeof(struct words)) – ec10