将深拷贝ctor添加到std :: unique_ptr <my_type>

Dar*_*ioP 5 c++ deep-copy copy-constructor unique-ptr c++11

我想把一些std::unique_ptr<my_type>存入一个std::vector.由于my_type提供了一种clone()方法,因此制作深层副本非常简单my_type *.关键是如何std::unique_ptr在添加复制ctor和赋值运算符时扩展保留其所有功能.遗产?Templace专业化?你能提供一个代码片段吗?

Snp*_*nps 7

其目的std::unique_ptr是使其独特,即它不应该是可复制的.这就是他们让它成为移动的原因.它用于表示独特的所有权.

如果你想做一个深层复制,那么让你的复制构造函数做它的工作,这就是它的用途.

std::unique_ptr<my_type> ptr1{new my_type{}};      // Lets say you have this.

std::unique_ptr<my_type> ptr2{new my_type{*ptr1}}; // Make deep copy using copy ctor.
Run Code Online (Sandbox Code Playgroud)

复制文件的目的是制作一份深层复制品.您不需要C++中的克隆方法.

  • 事实上,制作一份深刻的副本仍然是独一无二 当然我可以像你指出的那样复制,但这不允许我将指针存储在向量中.由于多态性,克隆方法就在那里. (2认同)
  • 这可能很古老,但这个解决方案是错误的。@Snps 不考虑在 my_type 是 unique_ptr 所持有的某些派生类型的基础的情况下发生的对象切片。此错误在编译时不可见,并且会造成严重破坏。OP使用克隆方法来保持多态性是正确的。 (2认同)

Dar*_*ioP 6

这看起来是一个可行的方法:

struct my_type_ptr: public std::unique_ptr<my_type,std::default_delete<my_type>>{
  using unique_ptr::unique_ptr; //inheriting constructors

  //adding copy ctor and assigment operator      
  my_type_ptr(const my_type_ptr & o):
    unique_ptr<my_type,std::default_delete<my_type>>()
    { reset( o ? o->clone() : nullptr); } 
  my_type_ptr& operator=(const my_type_ptr & o)
    { reset( o ? o->clone() : nullptr); return *this; }
};
Run Code Online (Sandbox Code Playgroud)

它编译时不会收到 gcc 和 clang 的任何警告,并且 valgrind 在处理副本和向量时不会报告任何内存泄漏。