C++ 具有唯一指针的深克隆和浅克隆

C++ 具有唯一指针的深克隆和浅克隆,c++,unique-ptr,C++,Unique Ptr,没有代码显示,但有一个一般性问题 如果您有一个具有唯一ptr的类,那么浅拷贝和深拷贝之间的区别是什么 复制相关?浅层复制通常会导致双自由和悬空指针错误 您不能对std::unique_ptr成员进行浅拷贝,因为std::unique_ptr的整个点是单一所有权。另一方面,具有std::shared_ptr类型成员的类型将按预期工作,因为shared_ptr是引用计数的 为了从另一个方向扩展上述差异,为了更好地解释注释,unique\u ptr的唯一所有权前提要求unique\u ptr(cons

没有代码显示,但有一个一般性问题

如果您有一个具有唯一ptr的类,那么浅拷贝和深拷贝之间的区别是什么
复制相关?

浅层复制通常会导致双自由和悬空指针错误

您不能对
std::unique_ptr
成员进行浅拷贝,因为
std::unique_ptr
的整个点是单一所有权。另一方面,具有
std::shared_ptr
类型成员的类型将按预期工作,因为
shared_ptr
是引用计数的

为了从另一个方向扩展上述差异,为了更好地解释注释,
unique\u ptr
的唯一所有权前提要求
unique\u ptr(const unique\u ptr&)
unique\u ptr&operator=(const unique\u ptr&)
be
=deleteshared_ptr
从概念上讲,在任何一种情况下都需要增加引用计数,并且不需要克隆


从理论上讲,您可以从其他一些可重用池中分配对象,并为您的
unique\u ptr
提供一个自定义删除器,该删除器不起任何作用。但是为什么要麻烦呢?如果您想要共享所有权,只需使用
shared\u ptr

使用默认复制构造函数的浅层复制指针将使您的指针悬空。(指向未分配/释放内存的指针)

unique\u ptr
不可复制。指针只能移动到另一个
唯一\u ptr
中,或制作成
共享\u ptr
unique\u ptr
的全部目的是对某个内存块有一个引用(在本例中是指针)


这意味着使用
unique\u ptr
进行浅复制是不可能的。

由于
std::unique\u ptr
的复制因子是
delete
d,编译器无法为包含
std::unique\u ptr
类生成默认复制因子(对原始指针执行浅复制)。在手动实现复制ctor时,必须使用深度复制来确保正确性。不推荐使用的
std::auto_ptr
是一个负面的例子。最大的区别是浅层复制是不可能的,深层复制不是。“浅层复制会给您留下双自由和悬空指针错误,通常是UB。”-不,这不是真的。默认的复制不起作用。然而,这与浅层复制不同。有一些浅层复制的实现既不是UB也不是泄漏(特别是通过
std::shared_ptr
)。@KonradRudolph,但不是默认的浅层复制吗?有什么区别?不,没有。“浅”的意思与深度复制相反,即没有可传递的复制构造函数调用嵌套对象。@KonradRudolph在这一点上,我不同意你的看法。很明显,对于我们中的任何一方所认为的肤浅复制,我们都有一些不同的想法。但是,如果我的观点发生变化,我将阅读更多关于这个主题的内容,并在将来更新这个答案。
unique\u ptr(const T&)
你可能指的是
unique\u ptr(const unique\u ptr&)
,即复制构造函数