C++ unique_ptr
2018年04月10日 23:17:58 hitsoft07 阅读数:69
template< class T, | (1) | (C++11 起) |
template < class T, > class unique_ptr<T[], Deleter>;
| (2) | (C++11 起) |
内存管理是C/C++中的一个难点,使用不当可能导致各种问题。智能指针的设计初衷,应该是简化指针的使用,使用户可以再使用过程中不需要显示释放申请的空间,或者防止申请的空间未释放导致的各类问题。但是如果不了解智能指针的实现,使用不当可能导致各类难以预料的问题。
unique_ptr被设计为管理某一对象的“唯一”指针,所谓唯一即不能同时有两个智能指针管理对象,否则会出错。通过 operator= 或 reset()赋值另一指针给管理的 unique_ptr
对象时,会用关联的删除齐Deleter删除原来管理的对象(如果有的话)。Deleter 负责被管理对象的释放,默认是通过delete或者delete []的方式释放空间。
std::default_delete::default_delete
constexpr default_delete() noexcept = default; | (1) | |
template <class U> | (2) | (仅为泛型 default_delete 模板的成员) |
template<class U> | (3) | (C++17 起) (仅为数组 default_delete 特化的成员) |
1) 构造 std::default_delete
对象。
2) 从另一 std::default_delete
构造 std::default_delete
对象。此构造函数仅若 U*
可隐式转换为 T*
才参与重载决议。
3) 从另一 std::default_delete<U[]>
对象构造 std::default_delete<U[]>
对象。此构造函数仅若 U(*)[]
可隐式转换为 T(*)[]
才参与重载决议。
void operator()(T* ptr) const; | (1) | (C++17 起,不再是 default_delete<T[]> 模板特化的成员) |
template <class U> | (2) | (仅为 default_delete<T[]> 模板特化的成员,但 C++17 前定义为被删除) |
1) 在 2) 定义为被删除。 | (C++17 前) |
1) 在 2) 在 | (C++17 起) |
任何情况下,若 U 是不完整类型,则程序为病式。
默认的Deleter会调用delete 或是delete[] 删除管理对象。如果管理的对象不是通过new或是new []方式生成,通过默认删除器删除可能存在问题。此时可以使用release()方法,释放管理权,由其他管理者负责释放。