c++ - c中free函数的一些问题探讨
天蓬老师
天蓬老师 2017-04-17 11:16:14
0
3
498

1 一次性分配较大内存,free如何获知该内存大小并完全释放,实现机制是?

2 如下代码:

int *p = (int*)malloc(sizeof(int));
free((char*)p);

什么情况下会出现内存泄漏?

3 <c prime>一书一个版本在高级数据结构一节中写过如下代码:

while(p != NULL){
    free(p);
    p = p->next;
}

这样的用法是否永远可行?

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全部回覆(3)
伊谢尔伦
  1. (glibc 的)malloc 等函數在分配時會記錄每塊記憶體的起始位置和大小
  2. 看你加 C++ 標籤了,但問的問題似乎只是 C。在 C 語言中,一般是不轉換 malloc 的回傳值的型別的。通常情況下不會有問題。當 char* 的大小比 int* 小時由於整型截斷,會出問題的(不是記憶體洩漏那麼簡單)。但好像找不到這兩種指標大小不一樣的系統了吧?
  3. 永遠不可行,因為它在邏輯上是錯的。一、另一線程可以在你訪問之前使用了該內存塊;二、內存分配器可以為了安全起見將已釋放的內存清零;三、其它情況。
左手右手慢动作

1和3回答的很清楚了,就補充下第二點:
C語言標準函式庫中,free函數原型是:
void free (void* ptr);
C語言標準中,void*和所有指向各種資料的指標都和char *一致,包括大小,對齊方式。
所以在資料指標之間進行各種轉換是沒有問題的。

但請注意:C語言標準並未規定資料指標和函數指標是一樣的,這是未定義行為。

大家讲道理
  1. malloc() 分配的記憶體區塊包含一個头块,用來記錄分配記憶體的大小等信息,free()會讀取這個區塊,對記憶體進行釋放。

  2. 分配 int 類型記憶體大小,而只釋放一半的空間(這裡假設 int 為2位元組),所以,當多餘的記憶體持續增加時,佔滿記憶體空間,就會導致記憶體洩漏。

  3. 這種釋放方法是錯誤的,確定書中是這麼寫的嗎?正確的寫法應該是:

for(p = head; p != NULL; p = q){
    q = p->next;
    free(p);
    }
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板