带有shared_ptr成员的c++复制构造函数

c++ copy constructor with shared_ptr members

本文关键字:c++ 复制 构造函数 成员 shared ptr 带有      更新时间:2023-10-16

来自cplusplus.com:

很少会遇到不包含原始指针的类然而,默认的复制构造函数是不够的。这方面的一个例子当您有一个引用计数的对象时。boost::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;}

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

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

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

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

这段话措辞不好,但我确信它是在谈论深度复制,但说shared_ptr不会提供深度复制。这是真的,因为这不是它的设计目的。

有人能详细说明一下吗?

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

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

没错。shared_ptr是用有效的复制语义正确设计的,所以在复制包含一个类对象的类对象时不需要专门处理它。

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

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

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