带有shared_ptr成员的c++复制构造函数
c++ copy constructor with shared_ptr members
来自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
是相当奇怪的。
我认为这意味着新类将引用旧类的资源,您可能希望为新类复制旧资源,就像它是该类的完整成员一样。两者都可以接受——这取决于你在做什么。
例如,如果你复制了一只狗,而一只狗有一块骨头,那么新的狗是有自己的骨头,还是共享原来的骨头?
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 使用strcpy将char数组的元素复制到另一个数组
- 是否可以初始化不可复制类型的成员变量(或基类)
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 复制列表初始化的隐式转换的等级是多少
- 当从函数参数中的临时值调用复制构造函数时
- 有可能在Armadillo中复制MATLAB circshift方法吗
- 复制几乎为空的数组的最快方法
- 以下示例中如何避免代码复制?C++/库达
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 为什么需要复制构造函数,在哪些情况下它们非常有用
- 不能将复制初始化与隐式转换的多个步骤一起使用
- 当有分配器意识的容器被复制/移动时,反弹分配器是否被复制/移走
- 为什么复制而不是移动数据元素?
- 文件系统:复制功能的速度秘诀是什么
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 为什么类中的ostringstream类型的成员会导致";调用隐含删除复制构造函数";错误
- 使lambda不可复制/不可移动