6

假设我有这样的方法

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

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

4

5 回答 5

7

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

myvector->push_back(rx);

在这里, in vector 将推送rx, not的副本rx,因此,引用计数器将递增。

于 2013-04-12T09:49:19.627 回答
2

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

于 2013-04-12T09:50:03.770 回答
1

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

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

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

于 2013-04-12T09:58:25.437 回答
0

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

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

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

myvector->push_back(rx);
于 2013-04-12T09:51:27.743 回答
0

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

myvector->push_back(rx); //Copy of object is passed.
于 2013-04-12T09:51:53.773 回答