[问题] 交互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