2012年4月4日 星期三

[筆記] 實務分享:當在 free(p) 時,程式出錯,問題何在?

 作者  ie945167 (龍蝦)                                      站內  Lobster
 標題  [筆記] 實務分享:當在 free(p) 時,程式出錯,問題何在?
 時間  2012/04/04 Wed 17:04:25
───────────────────────────────────────

不負責任聲明:以下憑印象+google寫成,有錯誤很正常 0rz

              如果有人願意指出錯誤,我會很感謝您的 <(_ _)>

--------------------本文開始分隔線--------------------

主管分享的經驗,我自己連 malloc, free 都沒寫過…悲劇 0rz

主管:「最近遇到一個問題,有個程式在 free(p)的時候掛掉,請問大家,原因為何?」

malloc():動態配置記憶體
free():釋放記憶體

p = malloc(100); //配置100個 byte 的記憶體位置給p,但不做初始化的動作


...
free(p); //掛掉 囧 why?

常見可能的原因:
1. p = NULL
2. p指標飛了,分配時的指向不一樣
3. free(p),p的值不是通過malloc()等函數得到的
4. p已經free過了
還有什麼原因?

我印象中,最後好像是 free 的空間大小與原本 malloc 所配置的大小不一樣
至於是怎麼查出來的呢?
可以看下面的解說

下面是一個記憶體空間

memory cookie   memory
 ______________________
|4 ~ 8 byte  | p      |
 ___________

              ↑
            pointer

(圖畫得不好請見諒…)

在指標(pointer)所指的位置前 4~8 個byte,有所謂的 memory cookie

好像是用來記錄後面的 memory 分配的大小

因此可以用 memory cookie 來判斷 free 的空間大小是否與原本配置的大小相同。

(主管用意在於讓我們知道有所謂的 memory cookie 這種東西的存在可以利用)


題外話,google得來:

malloc 和free 一定要成對出現,有malloc 的,一定要有free,

且注意malloc 分配的大小,防止破壞管理分配記憶體的資訊。

當陣列ar作為參數時,在函數體內,ar只是一個指標,

所以 sizeof(array)=4,而非陣列所含元素個數+1.

--

     接球會"噴"

我             舉球會"歪"              但是!   我算分超強 o(一︿一+)o

                         攻擊會"OUT"

--
▅◣ Origin:  謠 言 報  bbs.csie.fju.edu.tw
▋◤ Author: ie945167 從 219-85-0-189-adsl-nei3.dynamic.so-net.net.tw 發表

沒有留言:

張貼留言