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

【C++11】智能指针

什么是智能指针:

        智能指针是一个,用来存储指向动态分配对象的指针,负责自动释放动态分配的对象,防止堆内存泄漏。动态分配的资源,交给一个类对象去管理,当类对象声明周期结束时,自动调用析构函数释放资源。

 裸指针的缺点:

1.难区分执行一个或多个对象

2.难以判断是否该销毁,有没有多次销毁

3.难以缺点delete还是delete[]

常见智能指针:

auto_ptr、unique_ptr、shared_ptr、weak_ptr;

auto_ptr在C++11中被舍弃:不支持对象数组操作、赋值和复制会改变资源的所有权。

RAII获取资源即初始化

        充分地利用了c++语言局部对象自动销毁的特性来控制资源(内存heap、网络套接字、互斥量,文件句柄等)的生命周期。

 RALL过程中的四个步骤

  1. 设计一个类封装资源
  2. 在构造函数中初始化
  3. 在析构函数中执行销毁操作
  4. 使用时定义一个该类的局部对象

unique_ptr唯一型智能指针

        指针、资源一对一。不能两个指针指向一个地址,所以不支持普通赋值和拷贝构造,需要用移动构造和移动赋值。

shared_ptr共享型智能指针

        shared_ptr内有两个指针,_Ptr和_Rep;

_Ptr指向申请的空间,_Rep指向_Uses和_Weaks,创建指针后_Uses默认为1、_Weaks默认为1;

_Uses记录有多少个共享指针指向那个空间;

当_Uses值为0时,_Weaks也变为0,释放空间,指针置为空。

weak_ptr弱指针

        弱引用指针weak_ptr监视shared_ptr的生命周期,没有*->操作。

weak_ptr需要shared_ptr实例来初始化,同样有_Ptr和_Rep,当创建弱指针时,_Weaks+1

use_count()可以获取当前有几个共享性智能指针指向该资源即_Uses的值

//创建弱指针
int main()
{shared_ptr<int> pa(new int(10));weak_ptr<int> wp(pa);
}

expired()方法

        弱指针 expired() 方法用于检查所指向的对象是否已经被销毁,返回值是一个 bool 类型的变量,如果所指向的对象已经被销毁,则返回 true,否则返回 false。

        在某些情况下,我们需要检查所指对象是否还存在,以避免程序出现空指针异常或者未定义行为。这时就可以使用 weak_ptr 的 expired() 方法来判断所指对象是否已经被销毁,从而避免出现访问已经不存在的对象的情况。

lock()方法

        lock()方法获取所监视的shared_ptr

       弱指针是一种不拥有所指对象的智能指针,它只是对所指对象的一个观察者,因此它不能直接访问所指对象,而是需要通过转换为 shared_ptr 或者使用 lock() 方法获取一个 shared_ptr,然后才可以访问所指对象。

对于lock()返回的共享型智能指针一定要判断一下是否存在,存在与不存在lock都会返回指针。

shared_ptr<int>sp(new int(10));
weak_ptr<int> gw(sp);
shared_ptr<int>spt = gw.lock();
if(spt)
{//使用spt
}

http://www.lryc.cn/news/89956.html

相关文章:

  • 三、Go的常用命令以及Go的执行原理
  • ESP32 CAM 模块和 OpenCV 的二维码扫描器
  • 多链路传输技术在火山引擎 RTC 的探索和实践
  • 在Flask中构建API接口
  • Postgres vs MySQL
  • 02.IP地址以及静态路由配置
  • GD32(STM32)因为中断问题,导致不能进行程序 正常运行
  • 华为OD机试真题B卷 Java 实现【统计字符】,附详细解题思路
  • 深入理解设计原则之开闭原则(OCP)
  • 【学习随笔】
  • 【多路IO复用】select
  • cuda编程学习——基础知识介绍!干货向(三)
  • 30 VueComponent 事件的绑定
  • 作用域及作用域链
  • 深入解析Linux C/C++ 编程中的内存泄漏问题
  • 【爬虫第三章】 Python基础
  • 电力系统的虚假数据注入攻击和MTD系统研究(Matlab代码实现)
  • 【阿里云】阿里云OSS对象存储— 开通OSS服务、搭建OSS环境、快速入门
  • 代理对象Proxy是什么
  • 会话跟踪cookie和session
  • ACS Cent. Sci 2018 | 数据驱动的分子连续表征的自动化学设计
  • 安卓Termux搭建web服务器【公网远程手机Android服务器】
  • 【大数据之Hive】二、Hive安装
  • 三大特性之多态
  • 单调队列优化dp
  • 【低压配电漏电继电器660V/LLJ-100H/AC220V 中性点漏电保护 JOSEF】
  • [数据结构习题]栈——中心对称链
  • AMD Software Adrenalin Edition 23.5.1驱动发布,快速获取驱动
  • Visual Studio内引用Lua解释器,编译Lua源码,执行Lua脚本
  • 【赏】C语言迷宫游戏设计如何解决屏幕严重刷屏问题同时实现运行时间的显示