1 一次性分配较大内存,free如何获知该内存大小并完全释放,实现机制是?
2 如下代码:
int *p = (int*)malloc(sizeof(int)); free((char*)p);
什么情况下会出现内存泄漏?
3 <c prime>一书一个版本在高级数据结构一节中写过如下代码:
<c prime>
while(p != NULL){ free(p); p = p->next; }
这样的用法是否永远可行?
欢迎选择我的课程,让我们一起见证您的进步~~
char*
int*
1和3回答的很清楚了,就補充下第二點: C語言標準函式庫中,free函數原型是: void free (void* ptr); C語言標準中,void*和所有指向各種資料的指標都和char *一致,包括大小,對齊方式。 所以在資料指標之間進行各種轉換是沒有問題的。
但請注意:C語言標準並未規定資料指標和函數指標是一樣的,這是未定義行為。
malloc() 分配的記憶體區塊包含一個头块,用來記錄分配記憶體的大小等信息,free()會讀取這個區塊,對記憶體進行釋放。
头块
分配 int 類型記憶體大小,而只釋放一半的空間(這裡假設 int 為2位元組),所以,當多餘的記憶體持續增加時,佔滿記憶體空間,就會導致記憶體洩漏。
這種釋放方法是錯誤的,確定書中是這麼寫的嗎?正確的寫法應該是:
for(p = head; p != NULL; p = q){ q = p->next; free(p); }
char*
的大小比int*
小時由於整型截斷,會出問題的(不是記憶體洩漏那麼簡單)。但好像找不到這兩種指標大小不一樣的系統了吧?1和3回答的很清楚了,就補充下第二點:
C語言標準函式庫中,free函數原型是:
void free (void* ptr);
C語言標準中,void*和所有指向各種資料的指標都和char *一致,包括大小,對齊方式。
所以在資料指標之間進行各種轉換是沒有問題的。
但請注意:C語言標準並未規定資料指標和函數指標是一樣的,這是未定義行為。
malloc() 分配的記憶體區塊包含一個
头块
,用來記錄分配記憶體的大小等信息,free()會讀取這個區塊,對記憶體進行釋放。分配 int 類型記憶體大小,而只釋放一半的空間(這裡假設 int 為2位元組),所以,當多餘的記憶體持續增加時,佔滿記憶體空間,就會導致記憶體洩漏。
這種釋放方法是錯誤的,確定書中是這麼寫的嗎?正確的寫法應該是: