c++智能指针

2023-11-11

智能指针:智能指针也是模版,在头文件<memory>中

shared_ptr:允许多个指针指向同一个对象。shared_ptr<string> p; 可以指向string类型的智能指针。会自动销毁所管理的对象,还会自动释放相关联的内存。

unique_ptr:独占所指向的对象。

weak_ptr:是一种弱引用,指向shared_ptr所管理的对象。*/

 

shared_ptr<int> sp;

unique_ptr<int> up;

 

智能指针的操作

p.get:返回p中保存的指针,若智能指针释放了其对象,返回的指针所指向的对象也消失

p.awap(q):交换p和q中的指针

p.unique:若p.use_count为1,则返回true,否则返回false。shared_ptr独有操作

p.use_count:返回与p共像对象的智能指针数量。shared_ptr独有操作

 

make_shared:在动态内存中分配一个对象并初始化它,返回值指向此对象的shared_ptr*/

 

shared_ptr<int> sp1 = make_shared<int>(77);

auto sp2 = make_shared<vector<string>>();

 

shared_ptr自动销毁所管理的对象,当指向一个对象的最后一个shared_ptr被销毁时,shared_ptr会自动销毁此对象。

是通过析构函数实现的,当引用计数为0时销毁,还会自动释放相关联的内存。

 

直接管理内存

使用new动态分配和初始化对象int* p = new int;//可以初始化也可以不初始化

动态分配的const对象,const int* p = new const int(1024);

内存耗尽,返回空指针

动态释放内存,delete p;

指针和delete,不是释放非new创建的内存,不能将相同指针值多次释放

动态对象的生存期直到被释放时为止

delete之后重置指针值,提供有限的保护。delete p; p = nullptr;

 

 

shared_ptr和new的结合

不要混合使用普通指针和智能指针

不要使用get初始化另一个智能指针或为智能指针赋值*/

 

 

unique_ptr操作

u.release:u放弃对指针的控制全,赶回指针,并将u置空

u.reset:释放u指向的对象

u.reset(q):如果提供了内置指针q,令u指向这个对象,否则置为空

 

unique_ptr不支持普通的拷贝或赋值操作

当定义一个unique_ptr时,需要将其绑定到一个new返回的指针上

 

unique_ptr<string> unp1(new string("asfg"));

unique_ptr<string> unp2(p1);//错误 unique_ptr不支持拷贝

unique_ptr<string> unp3;

unp3 = unp1;// 错误 unique_ptr不支持赋值

 

weak_ptr操作

weak_ptr是一种部控制所指向对象生存期的智能指针

w.reset():将w置为空

w.use_count:与w共享对象的shared_ptr的数量

w.expired:若use_count为0返回true,否则返回false

w.lock:如果expired为true,返回一个空shared_ptr,否则返回一个指向w的对象的shared_ptr

 

weak_ptr是一种不控制所指向对象的生存期的智能指针,它指向一个shared_ptr管理的对象。

将一个weak_ptr绑定到一个shared_ptr不会改变shared_ptr的引用计数,

就是最后的shared_ptr被销毁,即使有weak_ptr指向该对象,也会被销毁。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++智能指针 的相关文章

随机推荐

  • Qt for Android——关于版本的选择(ABI和CPU版本)

    1 前景介绍 之前在开发Qt for Android程序的时候 不知道如何选择套件的版本 乱选一通 经常是程序开发完 到了运行选择设备的时候告诉我设备不匹配 不支持这个ABI 下面就来讲讲这些版本 2 Qt中套件对应的版本 在我们安装Qt的
  • JTest

    接到parasoft公司一位先生打来的电话 说下个月第二周到上海来 希望顺便给我们组培训一下JTest和C Test的使用 我是用java的 自然对JTest更感兴趣一些 上网一搜 原来JTest这么出名 自己的确孤陋寡闻了 看了一下价格
  • 如何下载微信支付证书(API证书)

    一 登录微信商户平台 1 商户平台登陆网址 微信支付 中国领先的第三方支付平台 微信支付提供安全快捷的支付方式http pay weixin qq com 2 登录方式 扫码登录登录 二 进入微信商户平台下载证书 1 点击账户中心 账户设置
  • Vue简易登陆页面

    目录 1 效果展示 2 Vue代码 3 存点图片 1 效果展示 2 Vue代码
  • selenium练习实例

    1 项目流程 2 中心调度 中心调度 defmain try total search total int re compile d search total group 1 fori inrange 2 total 1 next page
  • 一分钟解决Chrome浏览器主页被hao123、360和2345篡改简单有效方法

    当你打开浏览器看到各种首页跳转的页面 对于强迫症的我是不能接受的 各种情况都碰到了 现在给出解决方法 按照下面的方式去排查就可以一定能解决你的问题 如果不行的话你来打我呀 如果问题解决了希望你能推荐给其他人 提示 检查下杀毒软件有没有绑定浏
  • Raft一致性算法分析与总结

    Raft简介 Raft是一个用于日志复制 同步的一致性算法 它提供了和Paxos一样的功能和性能 但是它的算法结构与Paxos不同 这使得Raft相比Paxos更好理解 并且更容易构建实际的系统 为了强调可理解性 Raft将一致性算法分解为
  • 跨平台传输结构体的注意事项

    1 什么是跨平台 1 这里的平台是按照CPU的位数来划分 分为32位CPU和64位CPU 不同位数CPU的差异会影响到结构体的解析 2 在实际嵌入式开发中 存在 主芯片 从芯片 的多CPU的产品 或者数据需要在不同位数CPU的机器上传输 3
  • 矩阵乘法——基于GPU的并行编程模型CUDA程序设计

    矩阵乘法 基于GPU的并行编程模型CUDA程序设计 目录 矩阵乘法 基于GPU的并行编程模型CUDA程序设计 1 题目描述 2 设计思路 实验环境 3 源码 3 1 串行程序 3 2 并行程序 3 3 性能对比与分析 1 题目描述 题目1
  • 二分图笔记

    什么是二分图 二分图一般针对无向图问题 一张图中 如果能够把全部的点分到两个集合中 保证两个集合内部没有任何边 图中的边只存在于两个集合之间 即为二分图 判断二分图 1 染色法 即用两种颜色对于这张图进行染色 相邻的结点颜色不同 如果没有矛
  • 结构重参数化之二:RepVGG

    论文 RepVGG Making VGG style ConvNets Great Again 代码 GitHub DingXiaoH RepVGG RepVGG Making VGG style ConvNets Great Again
  • Vue中实现图片下载到本地功能和导出(下载)excel文件功能:

    一 实现图片下载到本地功能 需求 将勾选的列表项的id传给后台 让后台处理并下载对应的图片 1 后台接口 下载图片zip GET download 请求数据类型 application x www form urlencoded 响应数据类
  • 神武3手游微信月礼包服务器,千万红包雨豪礼送不停 《神武3》端手游今日同步上线...

    神武3 双端今日 11月24日 同步上线 公测盛典活动全面开启 新服齐开 还有海量礼包 千万红包雨以及神兽 iPAD等各种大礼等你来拿 神武3 今日公测 公测新服齐开 千万红包雨来袭 神武3 端游 手游今日同步上线之际 新服齐开 其中 端游
  • 【HDLBits 刷题 6】Circuits(2)Sequential Logic---Latches and Filp Flops

    目录 写在前面 Latches and Filp Flops Dff Dff8 Dff8r Dff8p Dff8ar Dff16e D Latch DFF1 DFF2 DFF gate Mux and DFF1 Mux and DFF2 D
  • fedora图形界面与命令行模式切换方法

    fedora 进入命令行 终端 startx 在图形界面的控制台上输入 init 3 即可停止 xwindow 如果无法返回到终端 可以按住 alt ctrl f2 f6启动到新的控制台 然后结束掉tty1上的xwindow 结束xwind
  • 二维数组 A[m][n] 按行优先和按列优先的 下标地址转换公式

    设二维数组 A m n 按行优先存储 每个元素占 p 个字节 则 Loc i j 的地址为 i n j p 第 i 行前面有 i 行 每行有 n 个元素 加上 第 i 行的的 j 个元素 所以地址 为 i n j p 1 若 j 从下标 1
  • 【Windows系统5分钟搭建Linux环境】

    安装 Linux 虚拟机 第1步 下载 VirtualBox 第2步 下载 Vagrant 第3步 拉取Linux虚拟机镜像 第4步 网络配置 网络地址转换 端口转发 注意 电脑需要开启 CPU 虚拟化 电脑开机时 进入BIOS界面设置 第
  • SpringSecurity学习笔记(十一)CSRF攻击以及CORS跨域

    参考视频 什么是CSRF CSRF 跨站请求伪造 也可称为一站式攻击 也可写作XSRF 按照字面意思来理解 跨站请求伪造 意思就是说用户登录了A网站之后 会话没有过期 然后登录了B网站 这个时候B网站中的请求访问了A网站 这个时候A网站就会
  • STM32 基础系列教程 44 - FSMC_LCD

    前言 TFT LCD 即薄膜晶体管液晶显示器 其英文全称为 Thin Film Transistor Liquid Crystal Display TFT LCD 与无源 TN LCD STN LCD 的简单矩阵不同 它在液晶显示屏的每一个
  • c++智能指针

    智能指针 智能指针也是模版 在头文件