[問題] free 之後

看板C_and_CPP作者 (BigBang)時間9年前 (2015/05/29 11:24), 編輯推噓7(7025)
留言32則, 16人參與, 最新討論串1/1
開發平台(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

05/29 11:28, , 1F
我認為除非你還要重複使用那個pointer,不然free過後還
05/29 11:28, 1F

05/29 11:29, , 2F
指回null,是沒意義又降低perfomance
05/29 11:29, 2F

05/29 12:34, , 3F
樓上+1, pointer有reuse需求, 才需要在free的時候設成NULL
05/29 12:34, 3F

05/29 12:37, , 4F
你前輩是對的 真的沒問題
05/29 12:37, 4F

05/29 12:38, , 5F
雖然該pointer指向某個地方 但是在他離開function消失
05/29 12:38, 5F

05/29 12:39, , 6F
之前你都不會再用他 那就不需要加了
05/29 12:39, 6F

05/29 12:43, , 7F
已經退租的房子,有沒有把契約打叉的差別?XD
05/29 12:43, 7F

05/29 12:44, , 8F
你的想法比較謹慎,也沒有錯,但額外開銷是否值得呢?
05/29 12:44, 8F

05/29 12:44, , 9F
開銷包括相對冗長的程式,以及執行所花費的時間
05/29 12:44, 9F

05/29 12:50, , 10F
這種通常會被optimize掉吧?
05/29 12:50, 10F

05/29 12:51, , 11F
其實最佳化開下去,編譯器看到後面沒用到說不定直接丟了y
05/29 12:51, 11F

05/29 13:02, , 12F
恩, 我是因為吃過野指標的虧, 所以把 NULL 當作default在做
05/29 13:02, 12F

05/29 13:04, , 13F
所以這次剛好討論到, 想說還是把情況弄清楚比較好
05/29 13:04, 13F

05/29 13:04, , 14F
額外一提, BIOS很多時候是不做編譯最佳化的
05/29 13:04, 14F

05/29 13:05, , 15F
多謝各位先進指教
05/29 13:05, 15F

05/29 14:22, , 16F
因為這種情況就算有 asign NULL 通常也會被最佳化掉
05/29 14:22, 16F

05/29 14:23, , 17F
可以用一個巨集把 free 跟 asign NULL 包裝起來
05/29 14:23, 17F

05/29 14:24, , 18F
好處是當指標的 scope 改變時可以減少非預期行為的機會
05/29 14:24, 18F

05/29 14:25, , 19F
#define SAFE_FREE(PTR) do{free(PTR);PTR=0;}while(0)
05/29 14:25, 19F

05/29 14:33, , 20F
Delphi有個FreeAndNil() 題外
05/29 14:33, 20F

05/29 20:51, , 21F
通常指回 NULL 的情況是這個指標會重覆使用, 如
05/29 20:51, 21F

05/29 20:52, , 22F
if(ptr==null) {ptr = new TYPE[] ;}
05/29 20:52, 22F

05/29 20:53, , 23F
if(ptr!=NULL) { delete ptr ; ptr = NULL ;}
05/29 20:53, 23F

05/29 21:09, , 24F
life 是local的話不用null,但多加一行也耗不了多少CPU
05/29 21:09, 24F

05/29 22:04, , 25F
lin 大 do while 可以拿掉吧
05/29 22:04, 25F

05/29 22:37, , 26F
用 do-while 是為了可以在 SAFE_FREE(PTR) 之後加上分號
05/29 22:37, 26F

05/29 22:43, , 27F
if(foo) SAFE_FREE(bar); 這樣沒do-while會壞掉
05/29 22:43, 27F

05/29 22:44, , 28F
do while false是macro的一種保險
05/29 22:44, 28F

05/29 23:17, , 29F
哈當初也是疑惑do while這個,不過google就有了@@
05/29 23:17, 29F

05/29 23:18, , 30F
這是 coding style,團隊講好比較重要 (才知道如何維護)
05/29 23:18, 30F

05/31 09:20, , 31F
其實delete會檢查ptr是否為null, 所以也不用寫
05/31 09:20, 31F

05/31 09:21, , 32F
if(ptr!=NULL) 這個.
05/31 09:21, 32F
文章代碼(AID): #1LPzl_4a (C_and_CPP)