標題 [筆記] 實務分享:當在 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 發表
沒有留言:
張貼留言