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

What happens if I assign `shared_ptr<T>&` to another reference of it

我已经实施了责任链设计模式,链中的每个元素都是一个 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);

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

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

如果没有发生复制,则 reference.Thus 没有问题 它不会递增 。而且它不应该因为引用没有与对象相同的语义,例如超出范围时不会调用析构函数(如何减少计数器然后?)。

在您的示例中,如果您打算修改指向的对象,则应该按值传递,或者按常量引用传递。因此,前者保证了对象的生命周期,而第二个保证了被引用 shared_ptr.

的生命周期