C++ unique_ptr

template<

    class T,
    class Deleter = std::default_delete<T>

> class unique_ptr ;
(1)(C++11 起)
template <

    class T,
    class Deleter

> 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()方法,释放管理权,由其他管理者负责释放。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值