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

Sid*_*Bob 11 c++ copy-constructor shared-ptr

来自cplusplus.com:

很少会遇到一个不包含原始指针的类,但默认的复制构造函数是不够的.例如,当您有一个引用计数对象时.boost :: shared_ptr <>就是一个例子.

有人可以详细说明吗?如果我们有一个包含a的类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;}
Run Code Online (Sandbox Code Playgroud)

cdm*_*dmh 17

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

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

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

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

这段话措辞严厉,但我确信这是在谈论深层复制,但是说这shared_ptr不会提供深层复制.这是事实,因为这不是它的设计目标.


Mik*_*our 6

有人可以详细说明吗?

并不是的; 这是胡言乱语.

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

那就对了.shared_ptr使用有效的复制语义进行了适当的设计,因此在复制包含一个的类对象时无需特别处理.

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