[問題] free 之後

作者: kroll (BigBang)   2015-05-29 11:24:37
開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
BIOS, UEFI. GCC or VC
C + 組語
問題(Question):
今天跟前輩聊到 allcate 之後的free
ex:
*VOID
Function A {
pointer = allocate ;
...
if (Status != Success) {
free (pointer)
return NULL;
}
return pointer;
}
Function B {
ptr = Function A ();
if (ptr == NULL) return;
}
我的觀念是認為雖然做了free, 但是記憶體中的內容 pointer位址還是指向某個地方
所以會有風險, 做NULL是有必要的 (pointer = NULL).
前輩認為, 如果是local function, 在free之後去做 pointer = NULL 是不需要的code
分歧點大概就是他認為毫無風險
我本身是數學系背景, 也沒什麼經驗舉例去說服前輩
想請教諸位, 真的如前輩所說, function/driver 過了就沒事了嗎?
補充說明(Supplement):
舉例內容不是UEFI語法, 只是大概的意思
UEFI BIOS的driver 大概指的是每一個獨立的程式檔
作者: ahwater01 (臭酸咖)   2015-05-29 11:28:00
我認為除非你還要重複使用那個pointer,不然free過後還指回null,是沒意義又降低perfomance
作者: qsort (Cos)   2015-05-29 12:34:00
樓上+1, pointer有reuse需求, 才需要在free的時候設成NULL
作者: overhead (overhead)   2015-05-29 12:37:00
你前輩是對的 真的沒問題雖然該pointer指向某個地方 但是在他離開function消失之前你都不會再用他 那就不需要加了
作者: james732 (好人超)   2015-05-29 12:43:00
已經退租的房子,有沒有把契約打叉的差別?XD你的想法比較謹慎,也沒有錯,但額外開銷是否值得呢?開銷包括相對冗長的程式,以及執行所花費的時間
作者: azureblaze (AzureBlaze)   2015-05-29 12:50:00
這種通常會被optimize掉吧?
作者: kdjf (我抓得到什麼呢?)   2015-05-29 12:51:00
其實最佳化開下去,編譯器看到後面沒用到說不定直接丟了y
作者: kroll (BigBang)   2015-05-29 13:02:00
恩, 我是因為吃過野指標的虧, 所以把 NULL 當作default在做所以這次剛好討論到, 想說還是把情況弄清楚比較好額外一提, BIOS很多時候是不做編譯最佳化的多謝各位先進指教
作者: linotwo (._.)   2015-05-29 14:22:00
因為這種情況就算有 asign NULL 通常也會被最佳化掉可以用一個巨集把 free 跟 asign NULL 包裝起來好處是當指標的 scope 改變時可以減少非預期行為的機會#define SAFE_FREE(PTR) do{free(PTR);PTR=0;}while(0)
作者: TobyH4cker (Toby (我要當好人))   2015-05-29 14:33:00
Delphi有個FreeAndNil() 題外
作者: EdisonX (卡卡獸)   2015-05-29 20:51:00
通常指回 NULL 的情況是這個指標會重覆使用, 如if(ptr==null) {ptr = new TYPE[] ;}if(ptr!=NULL) { delete ptr ; ptr = NULL ;}
作者: askacis (ASKA)   2015-05-29 21:09:00
life 是local的話不用null,但多加一行也耗不了多少CPU
作者: OPIV (Monitor)   2015-05-29 22:04:00
lin 大 do while 可以拿掉吧
作者: bibo9901 (function(){})()   2015-05-29 22:37:00
用 do-while 是為了可以在 SAFE_FREE(PTR) 之後加上分號
作者: azureblaze (AzureBlaze)   2015-05-29 22:43:00
if(foo) SAFE_FREE(bar); 這樣沒do-while會壞掉do while false是macro的一種保險
作者: KoenigseggG (地表最速)   2015-05-29 23:17:00
哈當初也是疑惑do while這個,不過google就有了@@
作者: uranusjr (←這人是超級笨蛋)   2015-05-29 23:18:00
這是 coding style,團隊講好比較重要 (才知道如何維護)
作者: ctrlbreak   2015-05-31 09:20:00
其實delete會檢查ptr是否為null, 所以也不用寫if(ptr!=NULL) 這個.

Links booklink

Contact Us: admin [ a t ] ucptt.com