首页 > 解决方案 > C++ std::shared_ptr,是否重载 operator= 以使用复制构造函数?

问题描述

如果我执行以下操作:

class Foo
{
    std::shared_ptr<Bar> bar;
    Foo(std::shared_ptr<Bar> bar)
    {
        this->bar = bar;
    }
}
std::shared_ptr<Foo> func()
{
    std::shared_ptr<Bar> bar_ptr(new Bar());
    std::shared_ptr<Foo> foo_ptr(new Foo(bar_ptr));
    return foo_ptr;
}

foo_ptr在其成员变量 bar中func()有一个有效的指针吗?似乎只有在设置this->bar = bar构造函数参数被复制时才会这样做。是否总是重写= 运算符std::shared_ptr以调用复制构造函数?

标签: c++memoryshared-ptr

解决方案


复制构造函数和赋值运算符都将使接收者与您传入的接收者共享所有权。但是,它们在内部执行该操作是一个实现细节。

当然,如果this->bar正在管理某个东西,那么它将释放它对它的共享所有权(如果它是最后一个拥有它的人,那么那里的任何东西Bar都会被删除)。

但是我在这里担心的是,Foo的构造函数中的this-> bar和bar都是相同的引用,这意味着内存中实际上只有一个shared_ptr对象,但我有2个变量引用了那个shared_ptr。

它们不是引用,bar并且this->bar是两个不同std::shared_ptr的对象,在分配之后,它们将(内部)指向内存中的同一位置(但它们仍然是两个不同的对象)。但是,std::shared_ptr是一个知道有多少其他std::shared_ptrs 指向它的类(共享所有权),并且只有在所有其他对象都消失后才会正确删除该对象(因此只有最后一个std::shared_ptr会销毁它)。


推荐阅读