(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> default_delete( const default_delete<U>& d ) noexcept; | (2) | (仅为泛型 default_delete 模板的成员) |
template<class U> default_delete( const default_delete<U[]>& d) noexcept; | (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> void operator()(U* ptr) const; | (2) | (仅为 default_delete<T[]> 模板特化的成员,但 C++17 前定义为被删除) |
1) 在
ptr 上调用
delete (初等模板)或
delete[] (数组特化)。
2) 定义为被删除。
| (C++17 前) |
1) 在
ptr 上调用
delete 。
2) 在
ptr 上调用
delete[] 。此函数仅若
U(*)[] 能隐式转换为
T(*)[] 才参与重载决议。
| (C++17 起) |
任何情况下,若 U 是不完整类型,则程序为病式。
默认的Deleter会调用delete 或是delete[] 删除管理对象。如果管理的对象不是通过new或是new []方式生成,通过默认删除器删除可能存在问题。此时可以使用release()方法,释放管理权,由其他管理者负责释放。