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

作者: Caesar08 (Caesar)   2014-06-08 20:13:17
問題(Question):
第一個問題
http://ideone.com/VhOgRi
我想讓兩個class的constructor互相為friend
但我不想使用我註解起來的地方
第二個問題
比較這兩份code
http://ideone.com/3JPtDg
http://ideone.com/ylRrpl
為什麼shared_ptr能做得到呢?
(主要原因是因為我的code是用pimpl去寫的,後來要改成unique_ptr時就發現錯誤了)
作者: Jockey66666 (往事已成追憶)   2014-06-08 20:27:00
unique_ptr在compile time需要知道destructor定義http://en.cppreference.com/w/cpp/memory/unique_ptr
作者: Caesar08 (Caesar)   2014-06-08 20:43:00
我看完了,可是我沒辦法理解,為什麼他需要deleter?我到是找到了這個,http://ppt.cc/l8h~
作者: Jockey66666 (往事已成追憶)   2014-06-08 21:32:00
可參考 http://ppt.cc/73gO 的寫法
作者: firose (guest也是也是也是也是也)   2014-06-09 11:14:00
連結只說跟 dynamic/static deleter 差異有關 也不是很清楚
作者: Caesar08 (Caesar)   2014-06-09 21:19:00
感謝firose,不過文章好長= =...
作者: firose (guest也是也是也是也是也)   2014-06-09 22:46:00
其實我後來看還是不太懂, 結果又研究了一下, 有些想法:主要是這兩個類別的 ctor、dtor 實作不太一樣, shared_ptr無參數建構子不做事, 只把一個參用計數的指標出使為 0它是 sp_counted_base, 然後解構子呼叫它的 release 這個函數, 不會依賴 T 所以不對它要求 complete typeunique_ptr 的 dtor 會去呼叫 default-deleter上面 J 大貼的連結中有說明 delete 一個沒有 dtor 的型別會編譯過關, 但是會有 undefined behavior 所以它的實作用sizeof 來達到編譯錯誤, 提醒使用者不能有 incomplete type那連結也指出如果呼叫 shared_ptr(T*) 這個版本會需要完整定義, 但是我們沒呼叫這版本, 而根據 template 特性, 沒呼叫到就不會具現化, 所以沒有問題剩下問題就是為什麼 unique_ptr 的解構式會被需要? 上面討論的論壇聯結都有說到
作者: Jockey66666 (往事已成追憶)   2014-06-09 23:58:00
針對dynamic/static deleter給一個小小例子http://ideone.com/egf9ip unique_ptr 版本http://ideone.com/sF0qB5 shared_ptr版本我destructor刻意不加上virtual可是shared_ptr會呼叫到derived,這就是dynamic結論:能用unique_ptr就盡量用unique_ptr比較有效率 :)

Links booklink

Contact Us: admin [ a t ] ucptt.com