unique_ptr使用说明

背景

指针问题一直是一个比较麻烦的事情,比如很多人说要用智能指针完全替换掉裸指针,有人说要用unique_ptr, 有人建议shared_ptr,可是实际看各种经典框架,发现一个框架什么指针都有,使用的方法也是无法八门,这里简单说一下unique_ptr的使用场景和注意事项。

unique_ptr

unique_ptr核心目的是:1.所有权唯一。2.避免所有人忘记delete。 但凡符合这两个要求就可以建议使用unique_ptr。

int main()
{
	unique_ptr<Foo> ptr = make_unique<Foo>(); //所有权是main函数,为了防止main函数忘记delete
}

unique_ptr注意事项

  1. unique_ptr的构造问题
    由于unique_ptr强调所有权唯一,所以不支持如下写法:
Foo ori_ptr = new Foo();
unique_ptr<Foo> ptr = ori_ptr; // 这样会导致资源所有权不唯一
unique_ptr<Foo> ptr{new Foo()}; // 这样可以,因为是右值指针,不存在资源所有权多份的风险
unique_ptr<Foo> ptr = make_unique<Foo>(); //推荐这样写
  1. unique_ptr的传参问题
  • unique_ptr传值:传值的话由于没有拷贝构造,但是支持移动拷贝构造(换句话就是需要move出原始的所有权)
void test(unique_ptr<Foo> parm)
{
	parm.fun();
}// parm会析构掉

unique_ptr<Foo> ptr = make_unique<Foo>();
test(std::move(ptr));//写法1
test(unique_ptr<Foo> (ptr.release()) );//写法2, 这样ptr会把所有权交给test函数,ptr会作废,后面ptr也不会再参与析构资源了,资源的析构会发生再test函数的结尾。
  • unique_ptr返回值:当返回值是unique_ptr的时候,需要保证要返回的智能指针是一个将亡值,换句话说是函数结束时要消失的对象,这样就可以把资源所有权交出去。
// 错误,因为parm不是一个将亡值,因为传引用的对象,函数不具有所有权,不会析构parm, 那么就不能作为返回值
unique_ptr<Foo> test_re(unique_ptr<Foo>& parm)
{
        parm->fun();
        return parm;
}
//正确,因为parm是一个再函数结束时候,马上要消亡的值
unique_ptr<Foo> test_re(unique_ptr<Foo> parm)
{
        parm->fun();
        return parm;
}
//正确,因为parm是一个马上要消亡的值
unique_ptr<Foo> test_re()
{
        unique_ptr<Foo> res = make_unique<Foo>(); 
        return res;
}
  • unique_ptr传引用
    和普通对象一样,在函数里面不会被析构,所有权依然在函数外面,但是如果函数里面被释放掉了,那么函数外的指针也将失去资源的所有权。

reset函数

reset函数,我理解就是重新设置智能指针的资源,当调用的这个函数时候,指针会首先调用原始资源的析构函数,也就是放弃原始资源的所有权,并且释放资源,然后才会接纳新的资源。

unique_ptr<Foo> test_in()
{
        unique_ptr<Foo> res = make_unique<Foo>(); 
        return res;
}

void test_fu(unique_ptr<Foo>& parm)
{
        cout<<"fun in"<<parm->a<<endl;
        parm.reset(nullptr);
}// parm会析构掉

int main()
{
        unique_ptr<Foo> new_owner = test_in();
        test_fu(new_owner);
        new_owner->fun();
        cout<<new_owner->a<<endl;
        return 0;
}

从执行结果上可以看出new_owner的控制的资源没有了,被替换成nullptr了
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/450926.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

可访问性使命:Facebook构建无障碍社交空间

在当今数字化时代&#xff0c;社交媒体已成为人们日常生活的重要组成部分&#xff0c;而Facebook作为全球最大的社交平台之一&#xff0c;其使命不仅在于连接世界&#xff0c;还在于构建一个无障碍的社交空间&#xff0c;让每个人都能参与其中。本文将深入探讨Facebook在可访问…

几个增强诊断详解

几个增强诊断 基于CAN线 ISO15031-5是排放相关的应用层协议&#xff0c;它不关心我们使用K线还是CAN线&#xff0c;主要用于监控车辆基本参数&#xff0c;例如监控里程、车速&#xff1b;用于监控排放相关的参数&#xff0c;比如各种尾气的含量&#xff0c;氧含量等等&#xf…

红队笔记7--Web机器为Linuxdocker逃逸

其实&#xff0c;不知道大家有没有想过&#xff0c;我们之前练习的都是web机器是windows的版本&#xff0c;但是其实&#xff0c;在现实生活中&#xff0c;服务器一般都是Linux的版本&#xff0c;根本不可能用到windows的版本 那么如果是Linux的话&#xff0c;我们就有很多的困…

【正点原子STM32探索者】CubeMX+Keil开发环境搭建

文章目录 一、简单开箱二、资料下载三、环境搭建3.1 安装Keil MDK3.2 激活Keil MDK3.3 安装STM32CubeMX3.4 安装STM32F4系列MCU的Keil支持包 四、GPIO点灯4.1 查阅开发板原理图4.2 创建STM32CubeMX项目4.3 配置系统时钟和引脚功能4.4 生成Keil项目4.5 打开Keil项目4.6 编译Keil…

K8s的kubeadm方式部署集群实例

目录 一、准备环境 主机清单 修改主机名 设置防火墙、selinux状态 主机名解析 固定ip 重启网卡 同步时间 关闭swap分区 二、获取镜像 三、安装docker 四、配置kubeadm源 安装依赖包及常用插件 1.配置kubeadm源&#xff0c;安装对应版本 2.加载相关ipvs模块 3.配…

Day17:开发流程、开发社区首页、项目的调试、版本控制

开发流程 一次请求过程 先开发DAO&#xff0c;再开发service&#xff0c;再开发controller 开发社区首页的分布实现 显示前10个帖子 创建帖子数据表 CREATE TABLE discuss_post (id int NOT NULL AUTO_INCREMENT,user_id varchar(45) DEFAULT NULL,title varchar(100) DEF…

使用Java的等待/通知机制实现一个简单的阻塞队列

Java的等待/通知机制 Java的等待通知机制是多线程间进行通信的一种方式。 有三个重要的方法&#xff1a;wait()&#xff0c;notify() 和以及notifyAll() wait()&#xff1a;该方法用于让当前线程&#xff08;即调用该方法的线程&#xff09;进入等待状态并且释放掉该对象上的…

SpringBoot中配置nacos

SpringBoot中配置nacos 在SpringBoot中使用nacos一定要注意name&#xff0c;使用openfeign特别要注意这个点。 spring:application:name: item-service需要的依赖包 config需要引入的包 <dependency><groupId>com.alibaba.cloud</groupId><artifactId…

搜索引擎:引擎霸屏推广的未来趋势解读-华媒舍

1. 引擎霸屏推广 引擎霸屏推广是一种广告推广策略&#xff0c;通过借助搜索引擎的广告服务&#xff0c;让广告展示在用户搜索关键词时的首页位置&#xff0c;以吸引潜在客户点击进入宣传页面。这种推广方式具有精准定位和较高的曝光率&#xff0c;对于产品推广和品牌塑造非常有…

IT驻场外包能提供哪些类型的服务?

随着信息技术的飞速发展&#xff0c;IT驻场外包作为一种高效的企业服务模式&#xff0c;正逐渐成为企业提升效率和削减成本的首选。这种外包形式将专业的IT人员直接派驻到客户现场&#xff0c;为企业提供全方位的技术支持和服务。本文将深入研究IT驻场外包所能提供的多种服务类…

51单片机基础篇系列-超声波测距

&#x1f308;个人主页&#xff1a;会编辑的果子君 &#x1f4ab;个人格言:“成为自己未来的主人~” HC-SR04产品特点 典型工作用电压&#xff1a;5V 超小静态工作电流&#xff1a;小于2mA 感应角度&#xff1a;不大于15度 探测距离&#xff1a;2cm-400cm 高精度&#…

新一代国产人工心脏推出,《2024心衰器械白皮书》重磅发布

2024年3月2日&#xff0c;永仁心医疗“EVA-Pulsar™新品发布会”在京举办。在国内外众多领域知名专家、投资人、企业家的共同见证下&#xff0c;永仁心最新一代EVA-Pulsar™人工心脏&#xff08;心室辅助装置&#xff09;重磅发布。 这款人工心脏集长期植入、超小体积、脉动血…

求最大公约数

本期介绍&#x1f356; 主要介绍&#xff1a;求两数的最大公约数&#xff0c;通过辗转相除法计算。 文章目录 1. 求最大公约数2. 遍历法3. 辗转相除法 1. 求最大公约数 题目&#xff1a;给定两个数&#xff0c;求这两个数的最大公约数。   最大公约数&#xff1a;指两个或多个…

MySQL--执行一条 select 语句,期间发生了什么?

执行一条 SQL 查询语句&#xff0c;期间发生了什么&#xff1f; 连接器&#xff1a;建立连接&#xff0c;管理连接、校验用户身份&#xff1b;查询缓存&#xff1a;查询语句如果命中查询缓存则直接返回&#xff0c;否则继续往下执行。MySQL 8.0 已删除该模块&#xff1b;解析 …

AI“造神运动”终结,杀死,重生

AGI回归本质&#xff0c;百亿美金创业机会涌现。 “专注AI技术迭代会让我焦虑&#xff0c;关注业务我不会焦虑&#xff0c;有些问题十年前存在十年后还在&#xff0c;我现在就明确不卷模型&#xff0c;只思考如何让产品能自我‘造血’。” 一位正卷在AI创业洪流里的硅谷创业者…

Qt对象树

对象树 1.QLabel* label new QLabal(this) 这个代码在new了之后没有释放&#xff0c;不会造成内存泄漏。 原因是这个对象是挂到了对象树上。 qt就是设计了一个n叉树&#xff0c;将各种元素组织起来了。 例如以下图 通过树形结构&#xff0c;就把界面上显示的这些控件对象…

韶音运动耳机好用吗?南卡、墨觉、韶音骨传导耳机三款全面评测

音乐是我生活中不可或缺的调味品&#xff0c;它伴随着我度过了无数个清晨的慢跑以及夜晚的悠闲散步。但是传统入耳式耳机总是让我感到不适&#xff0c;虽然它有着不错的降噪能力&#xff0c;但是很容易忽视周围环境的安全&#xff0c;而且运动的时候老容易掉。然后我遇到了骨传…

新质生产力浪潮下,RPA如何成为助力先锋?

新质生产力浪潮下&#xff0c;RPA如何成为助力先锋&#xff1f; 在数字化、智能化的今天&#xff0c;“新质生产力”一词越来越频繁地出现在我们的视野中。那么&#xff0c;究竟什么是新质生产力&#xff1f;它与我们又有什么关系&#xff1f;更重要的是&#xff0c;在这一浪潮…

【动态规划】代码随想录算法训练营第四十六天 |139.单词拆分,关于多重背包,你该了解这些! ,背包问题总结篇!(待补充)

139.单词拆分 1、题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 2、文章讲解&#xff1a;代码随想录 3、题目&#xff1a; 给定一个非空字符串 s 和一个包含非空单词的列表 wordDict&#xff0c;判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词…

LeetCode:206.反转链表

206. 反转链表 解题过程 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, ListNode next) { this.val val; this.next next; …