[問題] 交互friend以及智能指針的問題

看板C_and_CPP作者 (Caesar)時間10年前 (2014/06/08 20:13), 編輯推噓3(3025)
留言28則, 3人參與, 最新討論串1/1
問題(Question): 第一個問題 http://ideone.com/VhOgRi 我想讓兩個class的constructor互相為friend 但我不想使用我註解起來的地方 第二個問題 比較這兩份code http://ideone.com/3JPtDg http://ideone.com/ylRrpl 為什麼shared_ptr能做得到呢? (主要原因是因為我的code是用pimpl去寫的,後來要改成unique_ptr時就發現錯誤了) -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 220.134.98.152 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1402229601.A.E86.html

06/08 20:27, , 1F
unique_ptr在compile time需要知道destructor定義
06/08 20:27, 1F

06/08 20:43, , 3F
我看完了,可是我沒辦法理解,為什麼他需要deleter?
06/08 20:43, 3F

06/08 21:11, , 4F
我到是找到了這個,http://ppt.cc/l8h~
06/08 21:11, 4F

06/08 21:32, , 5F
可參考 http://ppt.cc/73gO 的寫法
06/08 21:32, 5F

06/09 11:14, , 6F
連結只說跟 dynamic/static deleter 差異有關 也不是很清楚
06/09 11:14, 6F

06/09 20:13, , 7F
http://ppt.cc/sNyW Type-erased deleter 這篇有部分說明
06/09 20:13, 7F

06/09 21:19, , 8F
感謝firose,不過文章好長= =...
06/09 21:19, 8F

06/09 22:46, , 9F
其實我後來看還是不太懂, 結果又研究了一下, 有些想法:
06/09 22:46, 9F

06/09 22:47, , 10F
主要是這兩個類別的 ctor、dtor 實作不太一樣, shared_ptr
06/09 22:47, 10F

06/09 22:48, , 11F
無參數建構子不做事, 只把一個參用計數的指標出使為 0
06/09 22:48, 11F

06/09 22:52, , 12F
它是 sp_counted_base, 然後解構子呼叫它的 release 這個
06/09 22:52, 12F

06/09 22:53, , 13F
函數, 不會依賴 T 所以不對它要求 complete type
06/09 22:53, 13F

06/09 22:55, , 14F
unique_ptr 的 dtor 會去呼叫 default-deleter
06/09 22:55, 14F

06/09 22:56, , 15F
上面 J 大貼的連結中有說明 delete 一個沒有 dtor 的型別
06/09 22:56, 15F

06/09 22:57, , 16F
會編譯過關, 但是會有 undefined behavior 所以它的實作用
06/09 22:57, 16F

06/09 22:58, , 17F
sizeof 來達到編譯錯誤, 提醒使用者不能有 incomplete type
06/09 22:58, 17F

06/09 22:59, , 18F
那連結也指出如果呼叫 shared_ptr(T*) 這個版本會需要完整
06/09 22:59, 18F

06/09 23:00, , 19F
定義, 但是我們沒呼叫這版本, 而根據 template 特性, 沒呼
06/09 23:00, 19F

06/09 23:00, , 20F
叫到就不會具現化, 所以沒有問題
06/09 23:00, 20F

06/09 23:02, , 21F
剩下問題就是為什麼 unique_ptr 的解構式會被需要? 上面討
06/09 23:02, 21F

06/09 23:04, , 22F
論的論壇聯結都有說到
06/09 23:04, 22F

06/09 23:58, , 23F
針對dynamic/static deleter給一個小小例子
06/09 23:58, 23F

06/10 00:00, , 24F
http://ideone.com/egf9ip unique_ptr 版本
06/10 00:00, 24F

06/10 00:00, , 25F
http://ideone.com/sF0qB5 shared_ptr版本
06/10 00:00, 25F

06/10 00:01, , 26F
我destructor刻意不加上virtual
06/10 00:01, 26F

06/10 00:02, , 27F
可是shared_ptr會呼叫到derived,這就是dynamic
06/10 00:02, 27F

06/10 00:05, , 28F
結論:能用unique_ptr就盡量用unique_ptr比較有效率 :)
06/10 00:05, 28F
文章代碼(AID): #1Jb5DXw6 (C_and_CPP)