如果我将`shared_ptr <t>&amp;`分配给它的另一个引用会发生什么

时间:2015-12-03 09:40:12

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

我实施了责任链设计模式,链中的每个元素都是shared_ptr。在这种情况下,我希望first作为链的起点last和链的一端,以便能够使用last添加新的链。在下面的函数中,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);

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

不,它不会增加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