【发布时间】:2019-02-19 12:07:05
【问题描述】:
我想保留一个大型(但不是特别复杂*)类的默认复制构造函数,但理想情况下,我想用智能指针替代一些原始指针成员。
unique_ptr 似乎是这个的默认值,但它隐式删除了我的类的复制构造函数。
shared_ptr 将允许我保留类的复制构造函数。这可能是坚持使用 shared_ptr 的一个很好的理由,即使我并不真正想要“共享”资源;我真的只想保留现成的复制构造函数(烦人为整个类编写手动复制构造函数,只是用 unique_ptr 替换指针),就像我仍然使用原始指针时一样。
搜索何时使用 shared_ptr 与 unique_ptr,我从来没有看到简单保存复制构造函数是使用 shared_ptr 的一个可能的关键原因(可能的例外https://stackoverflow.com/a/16030118/3673329,但没有提供任何细节),但我也这样做没有直接看到为什么这不是一个有效的选择。
我认为 shared_ptr 可能会占用更多资源,但假设我的情况并没有真正的问题。
*特别是,只要我使用原始指针成员而不是智能指针成员,类的默认/浅复制就可以满足我的目的。
【问题讨论】:
-
你如何为你的类定义复制操作,指向的对象会发生什么?谁拥有该对象?
-
说我们叫大类A,main()有:vector x; x.emplace_back(A(...[cnstrctr argumentmts]));这需要 A 具有有效的复制构造函数 afaik。
-
不,移动就足够了。
-
唯一指针和共享指针之间的选择不应该与类的构造函数有关。如果您的资源仅由一个所有者使用,则它的唯一 ptr.否则是共享的。如果您必须显式实现一个进行深度复制的复制构造函数 - c'est la vie.
-
@rustyx:谢谢。我在一个简单的示例中确认您所写的内容(小 A 类,具有 unique_ptr
等)。但是,当我改为使用我的真实(更大)A 时,我从 emplace_back(...) 中得到“‘A(const A&)’被隐式删除”以及 unique_ptr 成员已删除默认复制构造函数的抱怨。将 unique_ptr 替换为 shared_ptr 时,一切正常。
标签: c++ shared-ptr copy-constructor unique-ptr