【问题标题】:What happens if I assign `shared_ptr<T>&` to another reference of it如果我将 `shared_ptr<T>&` 分配给它的另一个引用会发生什么
【发布时间】:2015-12-03 09:40:12
【问题描述】:

我已经实现了责任链设计模式,链中的每个元素都是shared_ptr。在这种情况下,我想让first 作为链的开始,last 和链的结束,以便能够使用last 添加新的链 itms。在link 下面的函数中是当前链元素创建为局部变量,我使用下面的函数添加到链中:

void addLink(std::shared_ptr<ILink>& first, std::shared_ptr<ILink>& last, std::shared_ptr<ILink>& link)
{
    if (first == nullptr)
    {
        first = link;
        last = first;
    }
    else
    {
        last->setSuccessor(link);
        last = link;
    }
}

使用所有引用是否是一种好习惯,它会增加引用计数吗?

编辑:

这个方法是这样调用的:

    std::shared_ptr<T> first;
    std::shared_ptr<T> last = first;
    const std::shared_ptr<T> link = std::make_shared<T>(some_arguments_here);

所以引用是对对象的引用,它们仍然可能会增加使用次数。

【问题讨论】:

  • 有效吗?有哪些替代方案?
  • 您不会复制std::shared_ptr,因此无法增加自身的引用计数。因此,我认为这并不是特别好的做法。您通过值传递shared_ptr 以保证指向对象的有效性。这就是重点。

标签: c++ c++11 shared-ptr


【解决方案1】:

如果没有发生复制,则引用没有问题。因此它不会增加。并且它不应该因为引用不具有与对象相同的语义,例如当您超出范围时不会调用析构函数(那么如何减少计数器?)。

在您的示例中,如果您打算修改指向的对象,则应该按值传递,或者通过 const 引用传递。因此前者保证了对象的生命周期,而后者保证了引用的 shared_ptr 的生命周期。

【讨论】:

    【解决方案2】:

    不,它不会增加 use_count。 正如@BlueTrin 建议的那样,看看为什么你不应该或仅当你应该通过引用传递 shared_ptr 时。

    请看下面代码的输出。

    #include <iostream>
    #include <memory>
    
    using namespace std;
    
    typedef shared_ptr<int> APtr;
    int main()
    {
            APtr aptr1(new int);
            cout << "Use Count :" << aptr1.use_count() << endl;
            APtr aptr2 = aptr1;
            cout << "Use Count :" << aptr1.use_count() << endl;
            APtr& aptr3 = aptr1;
            cout << "Use Count :" << aptr1.use_count() << endl;
    }
    

    输出

    Use Count :1
    Use Count :2
    Use Count :2
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多