网站首页 文章专栏 请教shared_ptr在析构时的奇怪表现。
请教shared_ptr在析构时的奇怪表现。
编辑时间:2019-12-25 15:38:23 作者:lijixiang2010 2条评论


    出自:purecpp 欢迎关注微信公众号: purecpp

    地址: www.purecpp.org

    转载请注明出处!


来说两句吧
登录才能发表评论。
最新评论
  • qicosmos
    qicosmos 2019-12-26 14:39:23

    Hi lijixiang,

    你这个问题问得很好。

    原因是这样的:shared_ptr的构造函数是一个模板函数,shared_ptr会记住这个指针类型即你例子中的Base*类型,shared_ptr析构的时候会调用delete Base*的指针,而不管这个Base是否有虚的析构函数。

    简言之,在share_ptr模板类型和实际类型的析构函数都会被调用到。而unique_ptr则不会去调用模板类型的析构函数。


    也许你还想进一步了解为什么unique_ptr不会去调用基类的析构函数,这是因为shared_ptr和unique_ptr的实现方式不同导致的,shared_ptr中的模板参数T允许是一个incomplete type,最终是需要一个完整类型的,通过在最后删除的时候去调用这个incomplete type的析构函数来保证类型的完整性;

    而unique_ptr一开始就要求这个模板类型必须是complete type,所以也就不需要去调用模板参数类型的析构函数了。

  • qicosmos
    hl4 2019-12-29 17:45:30

    我的理解如下,

    多个对象使用shared_ptr不能确定谁是最后一个指针,它在声明指针时更不可能知道指针指向的实际类型,所以这里调用实际类型的析构就是shared_ptr必须解决的问题。

    unique_ptr则相反,它拥有指针(一般是它自己创建,少部分调用创建代码,总之是知道如何创建这个指针)它声明时就知道这个指针一定是它释放(或者交给知道如何释放代码),所以声明时知道实际类型。

    场景上决定,unique_ptr不需要解决shared_ptr的问题。

Absolutely

purecpp

一个很酷的modern c++开源社区


这里有创新的idea,这里有最酷的modern c++代码,这里有很棒的modern c++开源项目。purecpp社区邮箱 purecpp@163.com
友情链接