13

来自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;}
4

3 回答 3

20

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

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

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

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

这一段措辞很糟糕,但我确信它是在谈论深拷贝,但说这shared_ptr不会提供深拷贝。这是真的,因为这不是它的设计目的。

于 2013-07-24T13:04:39.210 回答
8

有人可以详细说明一下吗?

并不真地; 这是胡言乱语。

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

这是正确的。shared_ptr正确设计了有效的复制语义,因此在复制包含一个的类对象时无需专门处理它。

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

于 2013-07-24T13:03:24.897 回答
2

我认为这意味着新类将引用旧类的资源,您可能希望为新类复制旧资源,就像它是该类的正式成员一样。两者都可以接受——这取决于你在做什么。

例如,如果你复制一只狗,而一只狗有一根骨头,那么新狗是得到自己的骨头,还是共享原来的骨头?

于 2013-07-24T12:32:41.990 回答