c++智能指针

笑谈c++智能指针

c++的一切都是类或模板类, 万变不离其宗. 智能指针也是类,模板类. 不同的智能指针,就对应了不同的类实现了, 但是它们都利用了类对象有释放的时候会调用析构函数的原理. C++有以下几种智能指针:

  • auto_ptr : c++11之后就弃用了.
  • unique_ptr : 它代替了auto_ptr的位置.
  • shared_ptr : 它是不错, 但是用多了它,用效率问题的.
  • weak_ptr : 弱指针, 与shared_ptr配套使用, 它不会增加shared_ptr的引用计数.

auto_ptr

在c++11之后,它被弃用了,原因就是因为当把一个auto_ptr对象赋值给另一个变量时, 原有的对象的指针就为空了. 我们很容易实现它:

  1. 在析构函数中释放它管理的指针.
  2. 重载一个赋值运算符,处理一个赋值操作.

unique_ptr

unique_ptr与auto_ptr基本相似,有一点不一样: unique_ptr很聪明,它不允许拷贝构造也不允许赋值操作,只允许移动构造和移动赋值操作. 所以实现它也很容易:

  1. 把拷贝构造函数与赋值操作符定义为deleted, 定义移动构造函数与移动赋值操作符.
  2. ......(很常规的其它实现了)

其它:

  • 构造该对象时,优先使用make_unique_ptr函数(c++14引用的), 异常安全.
  • 初始化时,可以指定删除器.

shared_ptr

它允许多个shared_ptr对象共享一块内存, 与前两者有所不同. 本质是就是维护一个内存块的引用计数,引用计数什么时候变为0了,什么时候释放内存. 有几个注意点:

  1. 它的实现效率不如unique_ptr, 所以呢, 在使用权很明确时优先使用unique_ptr.
  2. 使用时避免循环引用的情况.

其它:

  • 构造该对象时,优先使用make_shared_ptr函数(c++11引用的), 异常安全.
  • 初始化时,可以指定删除器.

weak_ptr

它依附于share_ptr而活着, 请使用share_ptr或weak_ptr对象对它进行初始化. 生成一个weak_ptr对象不会增加share_ptr对象内的引用计数,所以是weak. 使用它时,一定要判断一下它指向的shared_ptr对象是否还存在(使用lock成员函数),然后再使用.


结束语

最后, 使用智能指针时,有一些坑,这里不想写了. 反正你明白了智能指针的本质,这些坑你就足踩不中了.

posted @ 2020-09-05 22:22  殷大侠  阅读(315)  评论(0编辑  收藏  举报