当前位置: 首页 > news >正文

智能指针(零):分类及简单特性

前言

智能指针的种类繁多,我听说过的就有这些:auto_ptrshared_ptrweak_ptrunique_ptrscoped_ptrscoped_arrayshared_arrayintrusive_ptr,这些智能指针看起来种类繁多,但实际上常用的就只有两三种,他们是shared_ptrweak_ptrunique_ptr,先简单了解一下这几个指针,后续再列出具体的例子和选择标准。

分类及特性

  1. auto_ptr

    这个指针历经沧桑,C++98中引入,C++11中弃用,C++17中被移除,弃用的原因主要是使用不当容易造成内存崩溃,不能够作为函数的返回值和函数的参数,也不能在容器中保存auto_ptr。

  2. shared_ptr

    据说是最好用的智能指针,使用引用计数实现,每使用它一次,内部的引用计数加1,每析构一次,内部的引用计数减1,减为0时,自动删除所指向的堆内存。shared_ptr内部的引用计数是线程安全的,但是对象的读取需要加锁。

  3. weak_ptr

    没有什么存在感,基本只在解除 shared_ptr循环引用时使用,weak_ptr没有共享资源,它的构造不会引起指针引用计数的增加,使用weak_ptr的成员函数use_count()可以观测资源的引用计数,使用成员函数lock()从被观测的shared_ptr获得一个可用的shared_ptr对象。

  4. unique_ptr

    一种比auto_ptr更加优秀的指针,可以唯一的拥有一个对象,auto_ptr通过等号赋值改变所有权后,再次引用原对象会造成内存崩溃,但是unique_ptr可以用过std::move改变所有权,并且引用原对象会在编译时期就指出错误,同时在容器算法中也可以使用,另有一种说法是说unique_ptrscoped_ptr在标准库中的一个分身。

  5. scoped_ptr

    存在于boost库而非标准库中,要把资源限制在作用域里的,并且永远不能被复制,是一种轻量级的智能指针,和const auto_ptr很像,但是可以被reset,并可以更加清楚地表明意图。

  6. scoped_array

    scoped_ptr一样,也是独享所有权的,用于管理动态数组,不支持复制,并且初始化的时候需要使用动态数组,没有重载operator*,需要使用get()函数。

  7. shared_array

    shared_ptr 一样,内部使用了引用计数,可以复制,通过参数来传递等,需要使用动态数组来初始化。

  8. intrusive_ptr

    这是一种侵入式的智能指针,内部不含有引用计数,要求被存储的对象自己实现引用计数功能,不然编译不过,还要提供intrusive_ptr_add_refintrusive_ptr_release函数接口供intrusive_ptr调用。

总结

  1. 智能指针的种类很多,但是只要掌握shared_ptrweak_ptrunique_ptr这三种指针的用法,就可以处理绝大多数问题。
  2. 智能指针的选择就根据特性来选,但是auto_ptr尽量不要用了,虽然历史悠久,但是毕竟由于各种诟病被抛弃了。
  3. 以上只给出了分类和简单特性,后续有时间会依次给出示例,指出用法和需要注意的点。

相关文章:

  • 智能指针(一):auto_ptr浅析
  • 智能指针(二):shared_ptr浅析
  • 智能指针(四):unique_ptr浅析
  • Lua中关于table对象引用传递的注意事项
  • VS2015调试dump文件时提示打不开KERNELBASE.dll
  • Mysql中使用select into语句给变量赋值没有匹配记录时的结果
  • 排序算法系列之(四)——抓扑克牌风格的插入排序
  • linux环境下服务器程序的查看与gdb调试
  • linux环境下运行程序常用的nohup和的区别
  • 排序算法系列之(五)——为目标打好基础的希尔排序
  • linux环境下查找包含指定内容的文件及其所在行数
  • Mysql查询可通过给条件字段添加索引提高查询速度
  • Mysql开启、查看慢查询日志
  • IP地址常见分类:A类、B类、C类、D类、E类
  • Mysql表连接:内连接、外连接、交叉连接、自然连接真的都不一样吗
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • Java方法详解
  • JS实现简单的MVC模式开发小游戏
  • mysql 5.6 原生Online DDL解析
  • TypeScript实现数据结构(一)栈,队列,链表
  • V4L2视频输入框架概述
  • vue--为什么data属性必须是一个函数
  • Vue组件定义
  • 第十八天-企业应用架构模式-基本模式
  • 翻译--Thinking in React
  • 构建二叉树进行数值数组的去重及优化
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 深度解析利用ES6进行Promise封装总结
  • 通过git安装npm私有模块
  • 微服务核心架构梳理
  • 携程小程序初体验
  • 用mpvue开发微信小程序
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • %@ page import=%的用法
  • (1)Nginx简介和安装教程
  • (7)STL算法之交换赋值
  • (solr系列:一)使用tomcat部署solr服务
  • (ZT)出版业改革:该死的死,该生的生
  • (八)c52学习之旅-中断实验
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (附源码)计算机毕业设计高校学生选课系统
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • (区间dp) (经典例题) 石子合并
  • (十六)一篇文章学会Java的常用API
  • (小白学Java)Java简介和基本配置
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • (转) RFS+AutoItLibrary测试web对话框
  • (转)http-server应用
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .net core使用ef 6
  • /proc/vmstat 详解