假设我有这样的方法
void foo(const boost::shared_ptr<Pfoo>& rx)
{
myvector->push_back(rx);
}
我读到当 boost::shared_ptr 作为引用传递时,它的引用计数不会增加。现在如果实际 ptr 超出范围会发生什么情况?
假设我有这样的方法
void foo(const boost::shared_ptr<Pfoo>& rx)
{
myvector->push_back(rx);
}
我读到当 boost::shared_ptr 作为引用传递时,它的引用计数不会增加。现在如果实际 ptr 超出范围会发生什么情况?
当通过引用传递指针时 - 没有复制发生,没有引用计数器递增。
myvector->push_back(rx);
在这里, in vector 将推送rx
, not的副本rx
,因此,引用计数器将递增。
当您通过引用传递时,您传递相同的指针 - 不会发生副本。所以生命周期rx
是绑定到原始对象的生命周期的。当你这样做时,push_back
容器会复制rx
并增加引用计数。
这是正确的。如果您传递对共享指针的引用,则该函数仅获得对调用者(共享)引用的(常规 C++)引用。它没有自己的(共享的)参考。如果调用者的(共享)引用被破坏,代码将失败。
这发生在我身上一次,并导致了一个难以追踪的严重错误并产生了实际后果。所以不要传递对对象的引用,除非你确定函数所做的任何事情都不会破坏被引用的对象!
push_back
创建对该对象的新引用。
不,下面的代码只是将智能指针传递给函数,不会增加它的引用计数:
void foo(const boost::shared_ptr<Pfoo>& rx)
此外,推rx
入向量将增加引用计数:
myvector->push_back(rx);
smart_ptr 作为参考传递,因此它不会在那时增加参考计数。在插入对象的矢量副本的情况下。所以引用会增加。
myvector->push_back(rx); //Copy of object is passed.