[問題] C++ primer 4/e中文版 p.496

看板C_and_CPP (C/C++)作者 (好滋好滋)時間9年前 (2016/05/28 02:12), 9年前編輯推噓1(109)
留言10則, 2人參與, 最新討論串1/1
此頁的參用計數class class U_Ptr{ friend class Hasptr; int *ip; size_t use; U_Ptr(int *p): ip(p), use(1) {} ~U_Ptr() {delete ip;} }; 為什麼這邊會直接delete? delete一個沒用動態配置的物件不是會有問題嗎? 我實際編譯也出問題,拿掉delete那行才通過編譯。 還是說他本來是想寫以下: class U_Ptr{ friend class Hasptr; int *ip; size_t use; U_Ptr(int *p): ip(new int(*p)), use(1) {} ~U_Ptr() { delete ip; } }; -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.229.135.40 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1464372744.A.13A.html ※ 編輯: ko27tye (36.229.135.40), 05/28/2016 02:13:58

05/28 03:20, , 1F
這節是在講 smart pointer , U_Ptr 只是一個代理 , 只負
05/28 03:20, 1F

05/28 03:20, , 2F
責最後的回收,且它的 ctor 也是 private,所以只有其
05/28 03:20, 2F

05/28 03:21, , 3F
friend class Hasptr 可以用它 . 採用的策略是用 Hasptr
05/28 03:21, 3F

05/28 03:22, , 4F
負責 new U_Ptr , 最後的 delete 交由 U_Ptr 自己做。
05/28 03:22, 4F

05/28 07:11, , 5F
不過實務上,大多數編譯器在release的時候ip都會null
05/28 07:11, 5F

05/28 07:12, , 6F
所以delete沒有問題,而所有的編譯器在debug build都
05/28 07:12, 6F

05/28 07:12, , 7F
會把ip刻意設定成非null值,跑起來就會炸掉
05/28 07:12, 7F

05/28 07:12, , 8F
不過這個不是spec,不要依賴這種行為 :Q
05/28 07:12, 8F

05/28 07:13, , 9F
但是這個的ip不是從外面傳進來的嗎?除非故意亂傳
05/28 07:13, 9F

05/28 07:13, , 10F
不然應該不是正確可delete的值就是null
05/28 07:13, 10F
所以是確保p扔進來前有用動態配置就行了是嗎? ※ 編輯: ko27tye (36.229.135.40), 05/28/2016 10:59:14 ※ 編輯: ko27tye (36.229.135.40), 05/28/2016 11:16:05
文章代碼(AID): #1NI8u84w (C_and_CPP)
文章代碼(AID): #1NI8u84w (C_and_CPP)