【问题标题】:Does adding a reference to a shared ptr increase the reference count添加对共享 ptr 的引用是否会增加引用计数
【发布时间】:2013-04-12 09:47:38
【问题描述】:

假设我有这样的方法

void foo(const boost::shared_ptr<Pfoo>& rx)
{
   myvector->push_back(rx);
}

我读到当 boost::shared_ptr 作为引用传递时,它的引用计数不会增加。现在如果实际的 ptr 超出范围会发生什么情况?

【问题讨论】:

    标签: c++ shared-ptr


    【解决方案1】:

    当通过引用传递指针时 - 没有发生复制,没有引用计数器递增。

    myvector->push_back(rx);
    

    这里,vector 中将推送rx 的副本,而不是rx,因此,reference-counter 将递增。

    【讨论】:

      【解决方案2】:

      当您通过引用传递时,您传递的是相同的指针 - 不会发生副本。所以rx 的生命周期与原始对象的生命周期绑定。当您执行push_back 时,容器将复制rx 并因此增加引用计数。

      【讨论】:

        【解决方案3】:

        没错。如果您传递对共享指针的引用,则该函数仅获得对调用者(共享)引用的(常规 C++)引用。它没有自己的(共享的)参考。如果调用者的(共享)引用被破坏,代码就会失败。

        这发生在我身上一次,并导致了一个难以追踪的严重错误并产生了实际后果。所以不要传递对对象的引用,除非你确定函数所做的任何事情都不会产生破坏被引用对象的效果!

        push_back 创建一个对该对象的新引用。

        【讨论】:

          【解决方案4】:

          没有。下面的代码只是将智能指针传递给函数,不会增加它的引用计数:

          void foo(const boost::shared_ptr<Pfoo>& rx)
          

          另外,将rx 推送到向量会增加引用计数:

          myvector->push_back(rx);
          

          【讨论】:

            【解决方案5】:

            smart_ptr 作为引用传递,因此它不会在那时增加引用计数。 在插入对象的矢量副本的情况下。所以引用会增加。

            myvector->push_back(rx); //Copy of object is passed.
            

            【讨论】:

            • 你的意思是如果复制了一个引用将会增加
            猜你喜欢
            • 1970-01-01
            • 2013-07-06
            • 2017-12-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-08-27
            • 1970-01-01
            相关资源
            最近更新 更多