use*_*112 4 c++ deep-copy copy-constructor shared-ptr
我知道当类中有原始指针数据成员时如何编写副本构造函数,但是当使用shared_ptr管理这些成员时如何编写副本构造函数?
是否存在应调用的copy()或clone()函数?有趣的是,我从未见过这样的例子。
复制构造函数用于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)
参考文献:
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)
| 归档时间: |
|
| 查看次数: |
7908 次 |
| 最近记录: |