看板 C_and_CPP 關於我們 聯絡資訊
開發平台(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 大概指的是每一個獨立的程式檔 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 60.250.30.118 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1432869887.A.124.html
ahwater01: 我認為除非你還要重複使用那個pointer,不然free過後還 05/29 11:28
ahwater01: 指回null,是沒意義又降低perfomance 05/29 11:29
qsort: 樓上+1, pointer有reuse需求, 才需要在free的時候設成NULL 05/29 12:34
overhead: 你前輩是對的 真的沒問題 05/29 12:37
overhead: 雖然該pointer指向某個地方 但是在他離開function消失 05/29 12:38
overhead: 之前你都不會再用他 那就不需要加了 05/29 12:39
james732: 已經退租的房子,有沒有把契約打叉的差別?XD 05/29 12:43
james732: 你的想法比較謹慎,也沒有錯,但額外開銷是否值得呢? 05/29 12:44
james732: 開銷包括相對冗長的程式,以及執行所花費的時間 05/29 12:44
azureblaze: 這種通常會被optimize掉吧? 05/29 12:50
kdjf: 其實最佳化開下去,編譯器看到後面沒用到說不定直接丟了y 05/29 12:51
kroll: 恩, 我是因為吃過野指標的虧, 所以把 NULL 當作default在做 05/29 13:02
kroll: 所以這次剛好討論到, 想說還是把情況弄清楚比較好 05/29 13:04
kroll: 額外一提, BIOS很多時候是不做編譯最佳化的 05/29 13:04
kroll: 多謝各位先進指教 05/29 13:05
linotwo: 因為這種情況就算有 asign NULL 通常也會被最佳化掉 05/29 14:22
linotwo: 可以用一個巨集把 free 跟 asign NULL 包裝起來 05/29 14:23
linotwo: 好處是當指標的 scope 改變時可以減少非預期行為的機會 05/29 14:24
linotwo: #define SAFE_FREE(PTR) do{free(PTR);PTR=0;}while(0) 05/29 14:25
TobyH4cker: Delphi有個FreeAndNil() 題外 05/29 14:33
EdisonX: 通常指回 NULL 的情況是這個指標會重覆使用, 如 05/29 20:51
EdisonX: if(ptr==null) {ptr = new TYPE[] ;} 05/29 20:52
EdisonX: if(ptr!=NULL) { delete ptr ; ptr = NULL ;} 05/29 20:53
askacis: life 是local的話不用null,但多加一行也耗不了多少CPU 05/29 21:09
OPIV: lin 大 do while 可以拿掉吧 05/29 22:04
bibo9901: 用 do-while 是為了可以在 SAFE_FREE(PTR) 之後加上分號 05/29 22:37
azureblaze: if(foo) SAFE_FREE(bar); 這樣沒do-while會壞掉 05/29 22:43
azureblaze: do while false是macro的一種保險 05/29 22:44
KoenigseggG: 哈當初也是疑惑do while這個,不過google就有了@@ 05/29 23:17
uranusjr: 這是 coding style,團隊講好比較重要 (才知道如何維護) 05/29 23:18
ctrlbreak: 其實delete會檢查ptr是否為null, 所以也不用寫 05/31 09:20
ctrlbreak: if(ptr!=NULL) 這個. 05/31 09:21