初始化 unique_ptr 的正确方法
Correct way of initializing a unique_ptr
正在学习如何在一般情况下使用智能指针和 C++...假设我有以下 class:
template<typename T>
class MyClass {
public:
MyClass(const T& def_val)
private:
std::unique_ptr<T> default_val;
};
如果我只想存储一个指向 T 类型对象的指针,其值在 default_val class 成员中,那么实现构造函数的惯用方法是什么?我的理解也是我根本不需要定义析构函数,因为 unique_ptr 会自动清理自身?
按照您编写代码的方式,MyClass 只能存储指向构造函数参数的 副本 的唯一指针:
MyClass::MyClass(const T& def_val)
: default_val(new T(def_val))
{
}
这意味着 T 必须是可复制构造的。
My understanding is also that I don't have to define a destructor at all, since the unique_ptr will automatically taking care of cleaning up itself?
正确。这是 unique_ptr
的两个主要目的之一,第二个是保证它只有一个所有者。
如果您使用的是 C++11,您还可以添加一个接受右值引用的构造函数
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、生成副本或临时文件
正在学习如何在一般情况下使用智能指针和 C++...假设我有以下 class:
template<typename T>
class MyClass {
public:
MyClass(const T& def_val)
private:
std::unique_ptr<T> default_val;
};
如果我只想存储一个指向 T 类型对象的指针,其值在 default_val class 成员中,那么实现构造函数的惯用方法是什么?我的理解也是我根本不需要定义析构函数,因为 unique_ptr 会自动清理自身?
按照您编写代码的方式,MyClass 只能存储指向构造函数参数的 副本 的唯一指针:
MyClass::MyClass(const T& def_val)
: default_val(new T(def_val))
{
}
这意味着 T 必须是可复制构造的。
My understanding is also that I don't have to define a destructor at all, since the unique_ptr will automatically taking care of cleaning up itself?
正确。这是 unique_ptr
的两个主要目的之一,第二个是保证它只有一个所有者。
如果您使用的是 C++11,您还可以添加一个接受右值引用的构造函数
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、生成副本或临时文件