带有shared_ptr成员的c ++拷贝构造函数

时间:2013-07-24 12:04:30

标签: c++ shared-ptr copy-constructor

来自cplusplus.com

  

很少你会遇到一个不包含原始指针的类   但默认的复制构造函数是不够的。这方面的一个例子   是你有一个参考计数对象。升压:: shared_ptr的<>是   示例

有人可以详细说明吗?如果我们有一个包含boost::shared_ptr的类,那么在类构造副本时不会构造复制 - 因此shared_ptr构造函数不会做正确的事情并增加引用计数吗?例如,以下代码正确复制Inner - 为什么这对shared_ptr不起作用?:

#include <iostream>
using namespace std;

class Inner
{
public:
 Inner() { cout << "inner default constructed" << endl;}
 Inner(const Inner& other) { cout << "inner properly copied" << endl;}
};

class Outer
{
 Inner i;
};

int main() { Outer o; Outer p(o); return 0;}

3 个答案:

答案 0 :(得分:16)

默认的复制构造函数将为每个成员变量使用复制构造函数,或为内置类型使用逐位复制。

如果您正在使用某种类型的共享指针,则复制构造函数将增加共享计数,原始对象和新对象都将指向同一对象。

在某些情况下,这就是你想要的;复制指针并正确管理引用计数,以便在不再使用资源时释放资源。

引用文章的背景是复制整个对象。在这种情况下,每个对象都应该有自己的子对象副本,而不是与其他实例共享子对象。在这种情况下,shared_ptr可能是错误的选择,绝对不会深层复制子对象。

该段落措辞严厉,但我确信它正在谈论深层复制但是说shared_ptr不会提供深层复制。这是真的,因为那不是它的设计目的。

答案 1 :(得分:6)

  

有人可以详细说明这个吗?

不是真的;这是胡言乱语。

  

如果我们有一个包含boost::shared_ptr的类,那么在类构造副本时不会构造复制 - 因此shared_ptr构造函数不会做正确的事情并增加引用算?

没错。 shared_ptr设计合理,具有有效的复制语义,因此在复制包含一个对象的类对象时无需特别处理。

可能,作者意味着如果你想复制而不是共享共享对象,那么你需要一个复制构造函数来创建一个新的。但是,如果您不想要共享所有权,那么使用shared_ptr会很奇怪。

答案 2 :(得分:1)

我认为这意味着新类将引用旧类的资源,您可能希望在新类的旧资源中创建一个副本,如果它是类的完整成员就会发生。要么是可以接受的 - 这取决于你在做什么。

例如,如果你复制一只狗,而一只狗有骨头,那么这只新狗会得到它自己的骨头,还是会分享原始骨骼?