添加对共享ptr的引用是否会增加引用计数

时间:2013-04-12 09:47:39

标签: c++ shared-ptr

假设我有一个这样的方法

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

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

5 个答案:

答案 0 :(得分:6)

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

myvector->push_back(rx);

此处,向量将被推送rx的副本,而不是rx,因此,引用计数器将递增。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

这是对的。如果传递对共享指针的引用,则该函数仅获取对调用者(共享)引用的(常规C ++)引用。它没有自己的(共享)引用。如果调用者的(共享)引用被破坏,则代码将失败。

这件事发生在我身上,造成了一个很难追查并产生实际后果的严重错误。所以不要传递对象的引用,除非你确定函数没有任何东西可以破坏引用的对象!

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

答案 3 :(得分:0)

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

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

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

myvector->push_back(rx);

答案 4 :(得分:0)

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

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