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()方法,释放管理权,由其他管理者负责释放。
本文深入探讨了C++中unique_ptr的使用与实现原理,强调其作为“唯一”智能指针的角色,避免资源管理错误。文章详细解释了unique_ptr如何通过operator=或reset()方法自动调用Deleter删除原有对象,确保资源正确释放。同时,讨论了std::default_delete的构造与操作符,以及在特定情况下的应用策略。
8584

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



