| (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()方法,释放管理权,由其他管理者负责释放。
本文详细介绍了C++中unique_ptr的使用方法及其背后的原理。解释了如何通过unique_ptr管理对象的生命周期,避免内存泄漏等问题,并介绍了Deleter的概念及其默认实现std::default_delete。
4238

被折叠的 条评论
为什么被折叠?



