复制具有shared_ptr数据成员的类的构造函数?

use*_*112 4 c++ deep-copy copy-constructor shared-ptr

我知道当类中有原始指针数据成员时如何编写副本构造函数,但是当使用shared_ptr管理这些成员时如何编写副本构造函数?

是否存在应调用的copy()clone()函数?有趣的是,我从未见过这样的例子。

Wug*_*Wug 6

复制构造函数用于std::shared_ptr创建第二个指针,该第二个指针与第一个指针共享所有权。当std::shared_ptr指向该指针的所有点都被破坏时,该指针将被破坏。

如果没有显式声明一个拷贝构造函数,则语言规范会降低将隐式提供合适的语言规范,并会调用类的每个成员的拷贝构造函数。

因此,换句话说,为您的类提供的隐式副本构造函数将调用shared_ptr<T>::shared_ptr(const shared_ptr<T> &),这将创建第二个指向同一对象的共享指针,并且看起来并不是您想要的。如果您想要该pointe的深层副本,则必须声明自己的副本构造函数以创建一个副本:

class Foo
{
    Foo(const Foo &other)
      : foobar(new Bar(*other.foobar.get()))
    {}

    shared_ptr<Bar> foobar;
}
Run Code Online (Sandbox Code Playgroud)

参考文献:


Snp*_*nps 4

std::shared_ptr有自己的复制构造函数,用于处理托管共享数据的引用计数。

struct Foo {
    Foo(int i) : ptr{std::make_shared<int>(i)} {}
    std::shared_ptr<int> ptr;
};

int main() {
    Foo f1{0};
    Foo f2{f1}; // Using the implicitly generated copy ctor.
    *f1.ptr = 1;
    std::cout << *f1.ptr << std::endl; // 1 (data is shared).
    std::cout << *f2.ptr << std::endl; // 1 (data is shared).
}
Run Code Online (Sandbox Code Playgroud)

如果您希望您的类具有资源所有权语义,那么只需将资源声明为具有自动存储持续时间的对象即可。

struct Foo2 {
    Foo2(int i) : i{i} {}
    int i; // Automatic object.
};

int main() {
    Foo2 f1{0};
    Foo2 f2{f1};
    f1.i = 1;
    std::cout << f1.i << std::endl; // 1
    std::cout << f2.i << std::endl; // 0
}
Run Code Online (Sandbox Code Playgroud)