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专业化?你能提供一个代码片段吗?
其目的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++中的克隆方法.
这看起来是一个可行的方法:
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 在处理副本和向量时不会报告任何内存泄漏。