c++ 智能指针 unique_ptr

使用指针时很容易出现内存泄漏,便引入了智能指针,c++ 11中主要有三类

  • std::unique_ptr:独占资源指针,同一时刻只能有一个指针指向同一个对象
  • std::shared_ptr:共享资源指针,同一时刻可以有多个指针指向同一个对象
  • std::weak_ptr:用来解决shared_ptr相互引用导致的死锁问题
  • auto_ptr:已经废弃

unique_ptr

头文件 #include <memcpy>
使用std::unique_ptr代替裸指针,在离开作用域时自动释放内存
std::unique_ptr的引用计数始终为1,其性能与裸指针几乎等同

初始化

unique_ptr是没有拷贝构造函数的,只支持右值拷贝构造

// 直接初始化
std::unique_ptr<int> ptr(new int(3));// make_unqiue 
// 注:该方法是c++ 14才有的
std::unique_ptr<int> ptr = std::make_unique<int>(3);// std::move 
// 移动语义初始化(实际上移动语义和匿名对象初始化最终都是调用右值拷贝构造函数)
std::unique_ptr<int> ptr1(new int(1));
std::unique_ptr<int> ptr2 = std::move(ptr1);// 还有一种错误初始化方式
std::unique_ptr<int> ptr1(new int(1));
std::unique_ptr<int> ptr2 = ptr1;  // 报错,尝试应用已删除的函数
std::unique_ptr<int> ptr3(ptr1);	// 报错,左值拷贝构造并未实现

成员函数

  1. release()
    释放,调用后智能指针和其所指向对象的联系再无联系,但是该内存仍然存在有效。它会返回裸指针,但是该智能指针被置空
    返回的裸指针我们可以手工delete来释放,也可以用来初始化另外一个智能指针,或者给另外一个智能指针赋值。

    std::unqiue_ptr<int> ptr1 = std::make_unique<int>(1);
    std::unique_ptr<int> ptr2(ptr1.release());	// 此时,ptr1 = nullptr
    
  2. reset()
    reset()不带参数情况:释放智能指针所指向的对象(释放因为它是独占,而不像shared_ptr还需要考虑引用计数),并将智能指针置空。
    reset()带参数时:释放智能指针所指向的对象,并将该智能指针指向新对象.

  3. get()
    返回智能指针中保存的裸指针
    返回值裸指针与智能指针共同管理对象

  4. swap()
    交换两个对象的指向

    unique_ptr<string> ps1(new string("good luck"));
    unique_ptr<string> ps2(new string("good luck2"));
    ps1.swap(ps2);
    std::swap(ps1, ps2);//也可使用标准库的swap
    

置空

  1. release和reset均可以置空
  2. nullptr也可以置空
    class A
    {
    public:A(){std::cout << "init" << std::endl;}~A(){std::cout << "~A" << std::endl;}
    };std::unique_ptr<A> ptra = std::make_unique<A>();
    ptra = nullptr;// out
    // init
    // ~A
    

unique_ptr转shared_ptr

使用std即可

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据增强的基本概念和应用

数据增强对于深度学习具有重要的意义&#xff0c;可以作为一个单独的模块应用于各种各样的任务中。为了加深对数据增强常用库的方法介绍&#xff0c;通过使用实际案例分析实现这些方法&#xff0c;使自己加深对计算机视觉领域下的数据增强的理解。 一.数据增强的概念 数据增强…

C++之模板类template

在C中&#xff0c;模板类是一种允许你编写通用类以处理各种数据类型的机制。通过使用模板类&#xff0c;你可以编写一次代码&#xff0c;然后使用不同的数据类型进行实例化&#xff0c;而无需为每种数据类型都编写一个新类。这有助于实现代码的重用和泛化。 一个实例&#xff…

【C语言】操作符

操作符分类 算术操作符移位操作符位操作符赋值操作符单目操作符关系操作符逻辑操作符条件操作符逗号操作符下标引用、函数调用和结构成员操作符 算术操作符 除了 % 操作符之外&#xff0c;其他的几个操作符可以作用于整数和浮点数。 对于 / 操作符如果两个操作数都为整数&am…

伺服电机:编码器原理与分类

什么是编码器&#xff1f; 编码器是将旋转位置的改变转换为电气信号。 编码器是伺服系统闭环控制不可缺少的部件&#xff0c;编码器应用在轴的闭环控制和大多数的自动化控制中。编码器为闭环控制提供位置或速度的实际测量值。 一、编码器的分类 从编码器的原理和产生的信号类…

数据结构之二叉搜索树(Binary Search Tree)

数据结构可视化演示链接&#xff0c;也就是图片演示的网址 系列文章目录 数据结构之AVL Tree 数据结构之B树和B树 数据结构之Radix和Trie 文章目录 系列文章目录示例图定义二叉搜索树满足的条件应用场景 示例图 二叉 线形(顺序插入就变成了线性树&#xff0c;例如插入顺序为&…

前端八股文(网络篇)一

目录 1.Get和Post的请求的区别 2.常见的HTTP请求头和响应头 3.常见的HTTP请求方法 4.HTTP与HTTPS协议的区别 5.对keep-alive的理解 6.页面有多张图片&#xff0c;HTTP是怎样的加载表现&#xff1f; 7.HTTP请求报文是什么样的&#xff1f; 8.HTTP响应报文是什么样&#x…

[uniapp] uni-ui+vue3.2小程序评论列表组件 回复评论 点赞和删除

先看效果 下载地址 uni-app官方插件市场: cc-comment组件 环境 基于vue3.2和uni-ui开发; 依赖版本参考如下: "dependencies": {"dcloudio/uni-mp-weixin": "3.0.0-3090820231124001","dcloudio/uni-ui": "^1.4.28","…

spring boot 自动扫描Controller、Service、Component原理

项目里面为什么不加上ComponentScan("com.yym.*")注解&#xff0c;也能加载到子目录里面的Controller&#xff0c;Service&#xff0c;Component的bean呢&#xff1f; 启动类没有ComponentScan注解 SpringBootApplication public class BootStrap {public static v…

非常好用的三款图片模糊变清晰的软件

在数字时代&#xff0c;照片的清晰度对于呈现高质量的视觉效果至关重要。然而&#xff0c;由于各种原因&#xff0c;我们有时会遇到模糊的照片。这时候&#xff0c;使用适当的软件来提高照片的清晰度就显得尤为重要。本文将介绍一些可以使模糊照片变清晰的软件&#xff0c;帮助…

前端面试题集合七(ES6、ES7、ES8、ES9、ES10、ES11、ES12)

ES6&#xff08;2015&#xff09; 1. 类&#xff08;class&#xff09; class Man {constructor(name) {this.name 小豪;}console() {console.log(this.name);} } const man new Man(小豪); man.console(); // 小豪 2. 模块化(ES Module) // 模块 A 导出一个方法 export …

linux读取优盘

在Linux系统中&#xff0c;你可以通过以下步骤来查看优盘的内容&#xff1a; 查看U盘是哪个设备&#xff1a;在终端输入sudo fdisk -l&#xff0c;会列出系统中所有的磁盘信息&#xff0c;你可以在其中找到你的U盘&#xff0c;它的名称可能会是/dev/sdb1或者/dev/sda1之类的。 …

Redis:原理速成+项目实战——Redis实战5(互斥锁、逻辑过期解决缓存击穿问题)

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位大四、研0学生&#xff0c;正在努力准备大四暑假的实习 &#x1f30c;上期文章&#xff1a;Redis&#xff1a;原理速成项目实战——Redis实战4&#xff08;解决Redis缓存穿透、雪崩、击穿&#xff09; &#x1f4da;订阅专…

Python(30):非对称加密算法RSA的使用(openssl生成RSA公私钥对)

Python(30)&#xff1a;非对称加密算法RSA的使用(openssl生成RSA公私钥对) 1、openssl生成RSA公私钥对 1.1、生成RSA公私钥对命令 [rootloaclhost ~]# openssl OpenSSL> genrsa -out rsa_private_key.pem 1024 Generating RSA private key, 1024 bit long modulus .. ...…

LeetCode(209)长度最小的子数组⭐⭐

给定一个含有 n 个正整数的数组和一个正整数 s &#xff0c;找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组&#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;返回 0。 示例&#xff1a; 输入&#xff1a;s 7, nums [2,3,1,2,4,3]输出&#xff1a;2…

AIGC无人直播系统技术

随着信息技术的快速发展和互联网的普及&#xff0c;直播行业迎来了蓬勃发展的机遇。然而&#xff0c;传统的直播方式存在一些局限性&#xff0c;如场地限制、设备携带不便等问题。为了解决这些问题&#xff0c;AIGC推出了一项创新性的无人直播系统技术。 AIGC无人直播系统技术…

如何寻找到相对完整的真正的游戏的源码 用来学习?

在游戏开发的学习之路上&#xff0c;理论与实践是并重的两个方面。对于许多热衷于游戏开发的学习者来说&#xff0c;能够接触到真实的、完整的游戏源码无疑是一个极好的学习机会。但问题来了&#xff1a;我们该如何寻找到这些珍贵的资源呢&#xff1f; 开源游戏项目 GitHub:地…

还不了解 Dockerfile 的同学不是好测试人

前言&#xff1a;近年来 Docker 非常火&#xff0c;想要玩好 Docker 的话 Dockerfile 是绕不开的&#xff0c;这就好比想要玩好 Linux 服务器绕不开 shell 道理是一样的。 今天我们就来聊一聊 Dockerfile 怎么写&#xff0c;那些指令到底是什么意思。 一、先来看一个简单的 Do…

RK3568上如何使用MPP进行硬解码

目录 前言正文一、FFmpeg 拉流处理二、RK3568 mpp硬解码1、简介2、普通mpp解码流程3、核心代码 END、总结的知识与问题1、一直出现jitter buffer full 这样的问题2、如何打印帧率&#xff1f;3、分析av_packet_alloc、av_init_packet、av_packet_unref、av_packet_free、av_fra…

机器人技能学习-robosuite-0-入门介绍

文章目录 前言模块介绍实战案例1&#xff1a;从 demo 中创建自己的 env案例2&#xff1a;更换属于自己的物体 前言 资料太少、资料太少、资料太少&#xff0c;重要的事说三边&#xff0c;想根据自己实际场景自定义下机器人&#xff0c;结果发现无路可走&#xff0c;鉴于缺少参…

判断vector、string是否存在某个元素

1、string字符串中是否存在某个字符&#xff08;char&#xff09; string中find()返回值是字母在母串中的位置&#xff08;下标索引&#xff09;&#xff0c;如果没有找到&#xff0c;那么会返回一个特别的标记npos。&#xff08;返回值可以看成是一个int型的数&#xff09; …