正确初始化unique_ptr的方法

时间:2015-01-15 10:48:50

标签: c++11

一般学习如何使用智能指针和C ++ ......假设我有以下类:

template<typename T>
class MyClass {
public:
  MyClass(const T& def_val)
private:
  std::unique_ptr<T> default_val;
};

如果我只想在default_val类成员中给出的值存储指向类型为T的对象的指针,那么实现构造函数的惯用方法是什么?我的理解是,我根本不需要定义析构函数,因为unique_ptr会自动清理它自己吗?

2 个答案:

答案 0 :(得分:3)

您编写代码的方式,MyClass只能存储指向构造函数参数的副本的唯一指针:

MyClass::MyClass(const T& def_val)
: default_val(new T(def_val))
{
}

这意味着T必须是可复制的。

  

我的理解是,我根本不需要定义析构函数,因为unique_ptr会自动清理它自己?

正确。这是unique_ptr的两个主要目的之一,第二个是保证它只有一个所有者。

答案 1 :(得分:3)

如果你正在使用C ++ 11,你还可以添加一个接受rvalue ref的构造函数

template<typename T>
class MyClass {
public:
  MyClass(T&& def_val) : default_val(new T(std::move(def_val))) {}
  MyClass::MyClass(const T& def_val) : default_val(new T(def_val)) {}
private:
  std::unique_ptr<T> default_val;
};

现在你同时接受const ref,生成副本或temporaries