我知道这是为了防止 unique_ptr 的两个副本有一个可能的悬空指针,其中指向的对象可能已经被释放以及类似的东西。但为什么他们不决定允许一种深度复制,而不是仅仅复制指针,而是分配新内存并将副本委托给 unique_ptr 的模板参数类型。
主要问题是,如果对象实际上是子类,那么盲目地用 new 调用模板参数的复制构造函数就会对对象进行切片,这通常是一件非常不安全的事情。
也就是说,我发现扩展 unique_ptr 很有用:
template<class T, class D = std::default_delete<T>>
class autoclone_ptr : public std::unique_ptr<T, D> {
public:
autoclone_ptr() = default;
autoclone_ptr(autoclone_ptr &&) = default;
autoclone_ptr &operator=(autoclone_ptr &&) = default;
autoclone_ptr(const autoclone_ptr &a) : std::unique_ptr<T,D>(a ? a->clone() : nullptr) {}
autoclone_ptr &operator=(const autoclone_ptr &a) {
auto *t = a.get();
this->reset(t ? t->clone() : nullptr);
return *this; }
};
Run Code Online (Sandbox Code Playgroud)
这只能针对定义了clone()避免切片问题的方法的类进行实例化。
| 归档时间: |
|
| 查看次数: |
819 次 |
| 最近记录: |