假设我有一个这样的方法
void foo(const boost::shared_ptr<Pfoo>& rx)
{
myvector->push_back(rx);
}
我读到当boost :: shared_ptr作为引用传递时,它的引用计数不会增加。现在,如果实际的ptr超出范围,上述情况会发生什么?
答案 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.