【发布时间】: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
假设我有这样的方法
void foo(const boost::shared_ptr<Pfoo>& rx)
{
myvector->push_back(rx);
}
我读到当 boost::shared_ptr 作为引用传递时,它的引用计数不会增加。现在如果实际的 ptr 超出范围会发生什么情况?
【问题讨论】:
标签: c++ shared-ptr
当通过引用传递指针时 - 没有发生复制,没有引用计数器递增。
myvector->push_back(rx);
这里,vector 中将推送rx 的副本,而不是rx,因此,reference-counter 将递增。
【讨论】:
当您通过引用传递时,您传递的是相同的指针 - 不会发生副本。所以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.
【讨论】: