[討論] 關於空指標的檢查時機

看板C_and_CPP作者 (番薯猴)時間4年前 (2019/09/18 16:27), 4年前編輯推噓7(7013)
留言20則, 12人參與, 4年前最新討論串1/2 (看更多)
正在工作,在修前人的 code。 假設現在有 function F 和 function G, function F 內執行的程式碼會呼叫 function G 並將某個指標作為參數傳入 G 想請問一下高手大大們,空指標的檢查一般都在: 1) function F 要傳入該指標到 function G 前 2) 收到該指標的 function G 的開頭 3) 1、2 兩者皆要 的哪個時機檢查最好? 又有什麼優缺點? 因為選方案 1 的話,要是某些時候呼叫 G 前忘記檢查就會出事,而且程式碼滿冗贅的; 可是如果用方案 2 的話,在某些情況下, 會呼叫 G 的 function F 可能已經存取過該指標,等於先保證不會為空, 那 2 的作法就等於每次都多一道檢查行為。 方案 3 沒看過,可能老鳥跟菜鳥沒串好 @@? 那有約定成俗的 coding rule 嗎? 一般都怎麼寫比較好? -- 2007: 用 2G 網路分享有關 3G 電波危害的嚇人文章 2010: 用 3G 網路分享有關 4G 電波危害的嚇人影片 2018: 用 4G 網路分享有關 5G 電波危害的嚇人高畫質影片 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.221.50.98 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1568795266.A.377.html

09/18 16:37, 4年前 , 1F
2
09/18 16:37, 1F

09/18 16:43, 4年前 , 2F
2,多檢查一下不會怎樣
09/18 16:43, 2F

09/18 17:50, 4年前 , 3F
如果不是預期會傳 nullptr 的話會用 assert 檢查吧
09/18 17:50, 3F

09/18 18:12, 4年前 , 4F
按架構layer區分是否檢查null: 檢查只需在layer的"介面"
09/18 18:12, 4F

09/18 19:25, 4年前 , 5F
一般是2
09/18 19:25, 5F

09/18 21:28, 4年前 , 6F
這要看責任的分配, 正常是 3, 不過這要看你的指標是
09/18 21:28, 6F

09/18 21:28, 4年前 , 7F
當 in/out param 哪一個, 給 nullptr 算不算例外, 這
09/18 21:28, 7F

09/18 21:28, 4年前 , 8F
要先從 API design 開始講起
09/18 21:28, 8F

09/18 23:27, 4年前 , 9F
慣例是2 確保fun 本身有排錯能力是基本
09/18 23:27, 9F

09/18 23:28, 4年前 , 10F
2
09/18 23:28, 10F

09/19 00:13, 4年前 , 11F
需看情況。 就程式穩定度考量。選2 :當G方法覆用時,
09/19 00:13, 11F

09/19 00:13, 4年前 , 12F
能夠保證不產生例外。 效能上:若F方法多次呼叫G方法
09/19 00:13, 12F

09/19 00:14, 4年前 , 13F
這種情況 就可能需要考慮移除G方法內的判斷。 另外
09/19 00:14, 13F

09/19 00:14, 4年前 , 14F
還有一種做法:就是保證不產生nullptr. ~
09/19 00:14, 14F

09/19 06:37, 4年前 , 15F
2 G G 可能不是只有這裡會被呼叫
09/19 06:37, 15F
謝謝大家,我會朝 2 的方向跟大家討論。 我的 function G 是不同地方都會 call 到的。 ※ 編輯: henry8168 (60.250.185.98 臺灣), 09/19/2019 16:31:32

09/19 20:30, 4年前 , 16F
2, 但是如果你設計的function會傳null出來,你應該
09/19 20:30, 16F

09/19 20:30, 4年前 , 17F
檢討不是設計錯誤
09/19 20:30, 17F

09/20 01:35, 4年前 , 18F
我選擇caller檢查優先,在遇到檢查nullptr這樣的抉擇之前
09/20 01:35, 18F

09/20 01:35, 4年前 , 19F
,我會更優先檢查使用指標的必要性,如果能以reference解
09/20 01:35, 19F

09/20 01:35, 4年前 , 20F
決,或是null object pattern替代,則不使用pointer…
09/20 01:35, 20F
文章代碼(AID): #1TWUg2Dt (C_and_CPP)
文章代碼(AID): #1TWUg2Dt (C_and_CPP)