unique_ptr的使用和陷阱

2023-11-08

转自:https://blog.csdn.net/qq_33266987/article/details/78784286

unique_ptr的使用

分配内存

与shared_ptr不同,unique_ptr没有定义类似make_shared的操作,因此只可以使用new来分配内存,并且由于unique_ptr不可拷贝和赋值,初始化unique_ptr必须使用直接初始化的方式。

 
  1. unique_ptr<int> up1(new int()); //okay,直接初始化

  2. unique_ptr<int> up2 = new int(); //error! 构造函数是explicit

  3. unique_ptr<int> up3(up1); //error! 不允许拷贝

不可 拷贝和赋值

与shared_ptr不同,unique_ptr拥有它所指向的对象,在某一时刻,只能有一个unique_ptr指向特定的对象。当unique_ptr被销毁时,它所指向的对象也会被销毁。因此不允许多个unique_ptr指向同一个对象,所以不允许拷贝与赋值。

unique_ptr的操作

  1. unique_ptr<T> up 
    空的unique_ptr,可以指向类型为T的对象,默认使用delete来释放内存

  2. unique_ptr<T,D> up(d) 
    空的unique_ptr同上,接受一个D类型的删除器d,使用删除器d来释放内存

  3. up = nullptr 
    释放up指向的对象,将up置为空

  4. up.release() 
    up放弃对它所指对象的控制权,并返回保存的指针,将up置为空,不会释放内存

  5. up.reset(…) 
    参数可以为 空、内置指针,先将up所指对象释放,然后重置up的值.

传递unique_ptr参数和返回unique_ptr

前面说了unique_ptr不可拷贝和赋值,那要怎样传递unique_ptr参数和返回unique_ptr呢? 
事实上不能拷贝unique_ptr的规则有一个例外:我们可以拷贝或赋值一个将要被销毁的unique_ptr (C++ Primer 5th p418)

 
  1. //从函数返回一个unique_ptr

  2. unique_ptr func1(int a)

  3. {

  4. return unique_ptr<int> (new int(a));

  5. }

  6.  
  7. //返回一个局部对象的拷贝

  8. unique_ptr func2(int a)

  9. {

  10. unique_ptr<int> up(new int(a));

  11. return up;

  12. }

传unique_ptr参数可以使用引用避免所有权的转移,或者暂时的移交所有权

 
  1. void func1(unique_ptr<int> &up){

  2. cout<<*up<<endl;

  3. }

  4. unique_ptr<int> func2(unique_ptr<int> up){

  5. cout<<*up<<endl;

  6. return up;

  7. }

  8.  
  9. //使用up作为参数

  10. unique_ptr<int> up(new int(10));

  11.  
  12. //传引用,不拷贝,不涉及所有权的转移

  13. func1(up);

  14. //暂时转移所有权,函数结束时返回拷贝,重新收回所有权

  15. up = func2(unique_ptr<int> (up.release()));

  16. //如果不用up重新接受func2的返回值,这块内存就泄漏了

向unique_ptr传递删除器

类似shared_ptr,用unique_ptr管理非new对象、没有析构函数的类时,需要向unique_ptr传递一个删除器。不同的是,unique_ptr管理删除器的方式,我们必须在尖括号中unique_ptr指向类型后面提供删除器的类型,在创建或reset一个这种unique_ptr对象时,必须提供一个相同类型的可调用对象(删除器),这个删除器接受一个T*参数。

unique_ptr的陷阱

不要与裸指针混用

unique_ptr不允许两个独占指针指向同一个对象,在没有裸指针的情况下,我们只能用release获取内存的地址,同时放弃对对象的所有权,这样就有效避免了多个独占指针同时指向一个对象。 
而使用裸指针就很容器打破这一点

 

 
  1. int *x(new int());

  2. unique_ptr<int> up1,up2;

  3. //会使up1 up2指向同一个内存

  4. up1.reset(x);

  5. up2.reset(x);


要避免写这样的程序

 

记得使用u.release()的返回值

在调用u.release()时是不会释放u所指的内存的,这时返回值就是对这块内存的唯一索引,如果没有使用这个返回值释放内存或是保存起来,这块内存就泄漏了

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

unique_ptr的使用和陷阱 的相关文章

  • PHP学习笔记——加密解密

    一 MD5算法 MD5消息摘要算法 Message Digest Algorithm 是R Rivest设计的 它对输入的任意长度的消息进行运算 产生一个128位的消息摘要 随着穷举攻击和密码分析的发展 MD5算法已经不再那么流行了 1 算
  • Python 中 import 的机制与实现

    转自 http python jobbole com 82604 本文所涉及到的代码在github上 概述 Python 是一门优美简单 功能强大的动态语言 在刚刚接触这门语言时 我们会被其优美的格式 简洁的语法和无穷无尽的类库所震撼 在真
  • boost::bind 详解

    转自 https www cnblogs com benxintuzi p 4862129 html boost bind是标准库函数std bind1st和std bind2nd的一种泛化形式 其可以支持函数对象 函数 函数指针 成员函数
  • MD5 加密算法详细介绍

    MD5是什么 message digest algorithm 5 信息 摘要算法 经常说的 MD5加密 就是它 信息 摘要算法 在下载一下东西时 经常在一些压缩包属性里 看到md5值 而且这个下载页面 很可能会在某一个地方 写了一句 此文
  • 需要注意字节序的大端(big endian)和小端(little endian)的几种情景

    大端 big endian 在内存中 按照从最低有效字节到最高有效字节的顺序存储对象 即数据的高字节 保存在内存的低地址中 而数据的低字节 保存在内存的高地址中 小端 little endian 在内存中 按照从最高有效字节到最低有效字节的
  • linux shell 编程

    转自 http blog csdn net fpmystar article details 4183678 和 http blog csdn net buutterfly article details 6615162 在进行linux测
  • C++ STL之vector用法总结

    转自 https www cnblogs com zhonghuasong p 5975979 html 介绍 vector是表示可变大小数组的序列容器 就像数组一样 vector也采用的连续存储空间来存储元素 也就是意味着可以采用下标对v
  • 机器学习——深度学习(Deep Learning)

    Deep Learning是机器学习中一个非常接近AI的领域 其动机在于建立 模拟人脑进行分析学习的神经网络 最近研究了机器学习中一些深度学习的相关知识 本文给出一些很有用的资料和心得 Key Words 有监督学习与无监督学习 分类 回归
  • 广度/宽度优先搜索(BFS)

    转自 https blog csdn net raphealguo article details 7523411 1 前言 广度优先搜索 也称宽度优先搜索 缩写BFS 以下采用广度来描述 是连通图的一种遍历策略 因为它的思想是从一个顶点V
  • 理解CPU/寄存器/内存之间的关系

    转自 https blog csdn net qq 27689785 article details 82975575 CPU 寄存器 内存 因为要了解多线程 自然少不了一些硬件知识的科普 我没有系统学习过硬件知识 仅仅是从书上以及网络上看
  • R与SPSS、SAS相比较_Python 在数据分析工作中的地位与R语言、SAS、SPSS 比较如何?

    转自 http m elecfans com article 611407 html 统计分析的软件和程序分析 能够用来做统计分析的软件和程序很多 目前应用比较广泛的包括 SPSS SAS R语言 Matlab S PLUS S Miner
  • C/C++编程笔记:C++中的指针与引用,又在什么时候使用?

    C和C 支持与大多数其他编程语言不同的指针 其他语言包括C Java Python Ruby Perl和PHP 从表面上看 引用和指针非常相似 都用于使一个变量提供对另一变量的访问 两者都提供了许多相同的功能 因此通常不清楚这些不同机制之间
  • QT学习——QFileSystemModel与QTreeView显示文件夹下的文件信息

    最近因为项目需求 使用QT做界面 新手学习 记录一些笔记 虽然QT已经做好了标准对话框的国际化 但是有时候对于中文的翻译可能达不到我们期望的 所以就需要我们自己来修改 比如下面的代码中 利用了国际化 写在main函数中 QApplicati
  • make时遇到File `Makefile' has modification time 4e+04 s in the future的解决办法

    1 原因 是虚拟机时间和电脑时间不匹配造成 2 解决办法 在VMware 菜单虚拟机 M gt 设置 S gt 选项下设置开启时间同步 然后重启虚拟机 3 若还出现 warning Clock skew detected Your buil
  • 24时区来源,CST,CET,UTC,DST,Unix时间戳概述、关系、转换

    全球24个时区的划分 相较于两地时间表 显示世界各时区时间和地名的世界时区表 Universal WorldTime 就显得精密与复杂多 通常世界时区表的表盘上会标示着全球24个时区的城市名称 全球24个时区是如何产生的 过去世界各地原本各
  • QT学习——QTreeView获取选中单行数据和多行数据

    个人感觉QTreeView有些地方的使用没有MFC的CListCtrl方便 比如在不响应单击信号的情况下 获取选中行的数据 单行和多行 也许因为我是新手吧 一 获取单行选中的数据 QModelIndex selected ui treeVi
  • C++11的时间新特性之high_resolution_clock

    转自 https blog csdn net cw hello1 article details 66476290 我在这里只是说一说high resolution clock的时间用法 这里有一个C 的网上的API地址 包含了C 11的新
  • Thread Local Storage---__thread 关键字的使用方法

    转自 http blog csdn net yusiguyuan article details 22938671 thread是GCC内置的线程局部存储设施 存取效率可以和全局变量相比 thread变量每一个线程有一份独立实体 各个线程的
  • C++回顾——引用和拷贝构造函数

    一 C 中的指针 C和C 指针的最重要的区别在于C 是一种类型要求更强的语言 C不允许随便地把一个类型的指针赋值给另一个类型 但允许通过void 来实现 C 不允许这样做 如果真想把某种类型当做别的类型处理 则必须显示地使用类型转换 二 C
  • 开源软件许可证—GPL、AGPL、LGPL、Apache、ZLIB/LIBPNG、MIT

    转自 http www dushibaiyu com 2013 08 E5 BC 80 E6 BA 90 E8 BD AF E4 BB B6 E8 AE B8 E5 8F AF E8 AF 81 gpl E3 80 81agpl E3 80

随机推荐

  • html2canvas多个id,在同一个canvas里显示多个图形

    代码 html js function id return document getElementById id 绘制正多边形的封装函数 window onload function var cnv1 canvas1 var cxt1 cn
  • kali linux子系统的网络配置

    kali linux子系统的网络配置 配置kali子系统时 踩了一些坑 主要是网络配置时卡了挺久 因为wsl2安装时默认为NAT模式 而在测试过程中 经常会需要反弹shell或开启服务让靶机下载文件之类的操作 因此最好使用桥接模式 kali
  • html鼠标背景特效,6种鼠标滑过按钮背景动画特效

    插件描述 这是一组效果非常酷的鼠标滑过按钮背景动画特效 该特效中 当鼠标滑过按钮时 使用CSS3 animation来动画backgroundsize和backgroundposition属性 来制作各种背景动画效果 简要教程 这是一组效果
  • 判断两个字符串是否相等的更好方法

    在Java中 判断两个字符串是否相等有几种常见的方法 以下是其中一些更好的方法 1 使用equals 方法 java String str1 Hello String str2 World if str1 equals str2 字符串相等
  • SpringMVC的请求(获取参数以及静态资源访问)

    SpringMVC的请求 SpringMVC的请求 1 SpringMVC的请求 获得请求参数 请求参数类型 理解 2 SpringMVC的请求 获得请求参数 获得基本类型参数 应用 3 SpringMVC的请求 获得请求参数 获得POJO
  • systemctl 命令详解及使用教程

    在本教程中 我们将向您介绍在运行systemd的linux系统上如何使用systemctl命令工具有效的控制系统和服务 Systemctl 介绍 Systemctl是一个systemd工具 主要负责控制systemd系统和服务管理器 Sys
  • VM虚拟机-安装Linux、windows、windows server超详细步骤演示

    本文章所展示的workstation为15 5版本 Linux为Redhat7 4版本 Windows为win10版本 windows server 2012版本 其他版本的安装过程都大致同理 目录 VMware Workstation安装
  • Linux编译FFmpeg

    Linux编译FFmpeg 1 下载FFmpeg源码 FFmpeg源码下载地址 http ffmpeg org download html 在下面选择版本 2 解压并创建生成目录 tar xvf ffmpeg snapshot tar bz
  • 单独编译使用WebRTC的音频处理模块

    单独编译使用WebRTC的音频处理模块 2016年12月08日 14 26 58 starRTC免费IM直播会议一对一视频 阅读数 8360 版权声明 starRTC免费im直播会议一对一视频 by elesos com starRTC c
  • Java中AWT、Swing与SWT三大GUI技术的原理与效率差异

    转自 http blog csdn net widegoose article details 333908 MineHe原创 看了一下对Java GUI讨论的帖子 所以写了一篇文章来阐述一下各种GUI技术的优劣 Java世界中 目前最知名
  • 黑马程序员Javaweb学习笔记02【request和response】

    该博客主要记录在学习黑马程序员Javaweb过程的一些笔记 方便复习以及加强记忆 系列文章 JavaWeb学习笔记01 BS架构 Maven Tomcat Servlet JavaWeb学习笔记02 request和response Jav
  • 模型训练——Loss函数 归纳汇总

    上一篇文章 语音降噪模型归纳汇总 很意外地收到了点赞收藏和关注 如此的反馈给了我极大的鼓舞 这里就再梳理了一下loss函数相关的知识 以求方便能作为一份工具性质的文章展现出来 能力一般 水平有限 欢迎大家指正 干货分享 欢迎收藏点赞加关注
  • (ESP32学习6)双核CPU的调用

    本来之前从来没有用过双核做东西 但是突然意识到他好像是双核的 所以找了一些资料更第一篇双核的调用 还是挺有趣的 博文会持续更FreeRTOS与双核相关内容 这一章先做一件最简单的事情 在两个核上创建简单任务让他们跑起来 先看代码再讲解 in
  • flink-cdc,clickhouse写入,多路输出

    1 场景 kafka日志数据从kafka读取 1 关联字典表 完善日志数据 2 判断日志内容级别 多路输出 低级 入clickhouse 高级 入clickhouse的同时推送到kafka供2次数据流程处理 2 实现 package com
  • 媒资知识图谱系统

    http wenku baidu com link url xEjnrOeeVaqCc5JNZfuFGewAFKWbPjZDI3FzopmFuDrxYIfXkU3fxaXnPDpI2 6 kvcbnwV 8irUddAmk2JpkZlD2B
  • 太赫兹技术的应用前景

    从振奋全国的神舟五号载人飞船开始 中国的航空进入了发展的快车道 有好奇的朋友问了 天上这么多的卫星 它们之间是怎么 交流 的 在太空中 两颗卫星在地球轨道上 运用传统卫星技术传数据需要一段时间才能完成传送 但太赫兹技术的出现 让卫星们可以不
  • vue3 Element UI使用自定义内容

    这里以Vue3版本的Element UI 举例 这是一个通知组件 通知的内容我们可以通过message参数来控制 例如
  • java解析json获取天气预报城市代码_利用json获取天气信息

    天气预报信息获取是利用json获取的 网上有非常多资源 源码 因为上面涉及到非常多天气信息 包含湿度 出行建议等 以及加入了全部城市代码的资源包 为了练手了解json的原理 我仅获取诚笃城市的最高温 最低温 城市名字 我的布局是通过一个bu
  • vue-cli3+ant-design-vue+typescript 注意事项

    项目参考vue cli3 web init ant design配置部分 1 实现ant disign vue的按需加载方案 1 引入所有的组件 然后加载到vue上面 components ant 2 对Ant Design Vue进行文件
  • unique_ptr的使用和陷阱

    转自 https blog csdn net qq 33266987 article details 78784286 unique ptr的使用 分配内存 与shared ptr不同 unique ptr没有定义类似make shared