C++笔记之unique_ptr转移堆内空间的所有权

news2024/12/23 17:47:45

C++笔记之unique_ptr转移堆内空间的所有权

code review!

文章目录

  • C++笔记之unique_ptr转移堆内空间的所有权
    • 一.C++笔记之unique_ptr转移堆内空间的所有权
      • 方法1.使用std::move函数
      • 方法2.使用std::unique_ptr的reset方法
      • 方法3.返回unique_ptr
      • 方法4.std::unique_ptr的swap方法
    • 二.unique_ptr的reset和release方法
      • 1.调用无参数的reset()方法
      • 2.调用有参数的reset()方法
    • 三.面试问题:返回局部变量的std::unique_ptr可以转移堆内存的所有权吗?
    • 四.通过 `std::move` 将所有权转移到调用函数中的另一个 `std::unique_ptr`,解决面试三的问题

一.C++笔记之unique_ptr转移堆内空间的所有权

std::unique_ptr在C++中用于表示对堆内存的独占所有权。这是一种非常有用的工具,可以帮助避免内存泄漏,并使内存管理变得更为简单。关于std::unique_ptr所有权的转移,主要有以下几种方式:

方法1.使用std::move函数

例1
在这里插入图片描述

例2
在这里插入图片描述

方法2.使用std::unique_ptr的reset方法

你可以使用reset方法将一个新的原始指针赋给unique_ptr。这将导致unique_ptr放弃对其当前内存的所有权,并接管新内存的所有权。
例1
在这里插入图片描述

例2
在这里插入图片描述

方法3.返回unique_ptr

在函数中,你可以返回一个unique_ptr,从而将所有权传递给调用者。例如:
在这里插入图片描述

方法4.std::unique_ptr的swap方法

通过std::unique_ptr的swap方法:可以交换两个unique_ptr的所有权。
在这里插入图片描述

以上就是unique_ptr所有权转移的几种主要方式。请注意,因为unique_ptr代表的是独占所有权,所以你不能通过赋值或复制将一个unique_ptr的所有权给另一个unique_ptr。尝试这样做会导致编译错误。

二.unique_ptr的reset和release方法

在这里插入图片描述

1.调用无参数的reset()方法

在这里插入图片描述

2.调用有参数的reset()方法

在这里插入图片描述

三.面试问题:返回局部变量的std::unique_ptr可以转移堆内存的所有权吗?

不可以。返回指向局部变量的 std::unique_ptr 并不能转移堆内存的所有权,因为局部变量的生命周期在函数退出时结束,此时 std::unique_ptr 的析构函数会被调用,尝试释放已经无效的内存地址,可能会导致未定义行为。

std::unique_ptr 的核心特性是独占所有权,它确保在一个时间点只有一个 std::unique_ptr 指向一个特定的资源。如果你希望将堆内存的所有权转移给另一个 std::unique_ptr,你应该使用 std::move 函数来显式地转移所有权。

下面是一个例子,演示了在函数中返回 std::unique_ptr 的情况:

#include <iostream>
#include <memory>

std::unique_ptr<int> createUniquePtr(int value) {
    std::unique_ptr<int> ptr(new int(value));
    return ptr; // 返回局部变量,尝试转移所有权,但是会导致问题
}

int main() {
    std::unique_ptr<int> ptr = createUniquePtr(42); // 错误:悬空指针,因为局部变量已经被销毁
    // 尝试访问 ptr 会导致未定义行为
    return 0;
}

上述代码会产生未定义行为,因为在 createUniquePtr 函数退出时,局部变量 ptr 将被销毁,std::unique_ptr 的析构函数将被调用,尝试释放已经无效的内存。

要避免这种情况,你应该在函数中创建一个 std::unique_ptr,然后通过 std::move 将所有权转移到调用函数中的另一个 std::unique_ptr

四.通过 std::move 将所有权转移到调用函数中的另一个 std::unique_ptr,解决面试三的问题

在这里插入图片描述
std::move 是一个 C++ 标准库中的函数,它将一个左值(左值引用)转换为右值引用,从而允许将资源的所有权有效地从一个对象转移到另一个对象,而不触发资源的拷贝或移动操作。

在上述例子中,std::move(ptr)std::unique_ptr<int> 对象 ptr 从一个左值转换为一个右值引用,使得 createUniquePtr 函数可以接受并返回这个右值引用,从而实现了资源的所有权转移。

这样做的好处是,可以避免不必要的资源拷贝和移动,从而提高代码的效率。但要注意,一旦资源的所有权转移后,原始的对象(在这里是 ptr)应该被视为无效,不再访问或使用它,以防止悬空指针和未定义行为。

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

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

相关文章

http学习笔记3

第 11 章 Web 的攻击技术 11.1 针对 Web 的攻击技术 简单的 HTTP 协议本身并不存在安全性问题&#xff0c;因此协议本身几乎不会成为攻击的对象。应用 HTTP 协议的服务器和客户端&#xff0c;以及运行在服务器上的 Web 应用等资源才是攻击目标。目前&#xff0c;来自互联网的攻…

LaWGPT零基础部署win10+anaconda

准备代码&#xff0c;创建环境 # 下载代码 git clone gitgithub.com:pengxiao-song/LaWGPT.git cd LaWGPT # 创建环境 conda create -n lawgpt python3.10 -y conda activate lawgpt pip install -r requirements.txt # 启动可视化脚本&#xff08;自动下载预训练模型约15GB&…

(三)行为模式:1、责任链模式(Chain of Responsibility Pattern)(C++示例)

目录 1、责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;含义 2、责任链模式的UML图学习 3、责任链模式的应用场景 4、责任链模式的优缺点 5、C实现责任链模式的实例 1、责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;含义 责任…

ElasticSearch相关概念

1、概述 先说Elasticsearch的文件存储&#xff0c;Elasticsearch是面向文档型数据库&#xff0c;一条数据在这里就是一个文档&#xff0c;用JSON作为文档序列化的格式&#xff0c;比如下面这条用户数据&#xff1a; {"name" : "John","sex"…

论文写作中容易忽略的空格

持续更新吧&#xff0c;给自己提个醒&#xff0c;老是忘 1、数字和单位之间有一个四分之一空格&#xff0c;严格来说属于特殊符号&#xff0c;不知之间按空格键 应用场景&#xff1a; latex&#xff1a;语句$ 3\,m$ 可以实现&#xff0c; origin&#xff1a;网上的教程说可…

【HarmonyOS】【DevEco Studio】ohpm安装失败该如何解决?

【关键词】 HarmonyOS、DevEco Studio、ohpm安装失败 【问题背景及解决方案】 最近遇到很多DevEco Studio安装ohpm失败的问题&#xff0c;下面给大家介绍几种出现的问题以及解决方案&#xff1a; 1、ohpm not set up&#xff0c;报错截图如下&#xff1a; ​ 解决方案&…

AWS WAF实战、优势对比和缺陷解决

文章目录 挑战和目标AWS WAF的优势AWS WAF的不足我是怎么做的?什么是比较好的AWS WAF设计? 笔者为了解决公司Web站点防御性问题&#xff0c;较为深入的研究AWS WAF的相关规则。面对上千万的冲突&#xff0c;笔者不得设计出一种能漂亮处理冲突数据WAF规则。 AWS WAF开发人员在…

angular 的 alert 的应用分析笔记

声明: 今天自己在写angular项目时 遇到alert问题 做个记录而已 不代表广大angular用户,如果多你有帮助那个就是凑巧!!!! 效果: 第一步: 第二步: 第三步: 是不是找不到,ModaUtils这个方法(因为我项目里有这个 文件 里边存了 alert和confirm等公共方法) 都说了是个人笔记,看看…

启动 WSL 2时报错“参考的对象类型不支持尝试的操作”

引言 启动 WSL 2时报错“参考的对象类型不支持尝试的操作”。 或者是&#xff1a;占位程序接收到错误数据 Error code: Wsl/Service/0x8007273d 一番搜索 发现说和代理有关。 解决方案&#xff1a; 最有用的解决方案看这个issue。 这里我给出我的总结方案&#xff1a; 首…

84-基于stm32单片机蔬菜大棚温湿度光照强度监测控制系统Proteus仿真+源码

资料编号&#xff1a;084 一&#xff1a;功能介绍&#xff1a; 1、采用stm32单片机OLED显示屏光照强度检测DHT11温湿度电机按键LED灯&#xff0c;制作一个温湿度采集、光照强度检测&#xff0c;OLED显示相关数据&#xff0c; 2、通过按键设置温度上限、湿度下限、光照强度下限值…

webrtc学习(五)-peerconnect_client

一.类关系图 conduct实现webrtc native api相关实现的调用&#xff0c;创建answer&#xff0c;创建offer&#xff0c;是最核心的&#xff0c;对于两个模块的调度&#xff1b;mainwindow主要用于界面的展示与调度。橙色模块主要是信令模块&#xff0c;所有的用户的登录登出交换信…

71 # 协商缓存的配置:通过内容

对比&#xff08;协商&#xff09;缓存 比较一下再去决定是用缓存还是重新获取数据&#xff0c;这样会减少网络请求&#xff0c;提高性能。 对比缓存的工作原理 客户端第一次请求服务器的时候&#xff0c;服务器会把数据进行缓存&#xff0c;同时会生成一个缓存标识符&#…

Android系统-进程-AIDL

引言&#xff1a; Android系统的进程间通信&#xff0c;主要是Binder&#xff0c;AIDL就是一种Android接口定义语言&#xff0c;主要就是为了能更简单方便地实现跨进程通信。 概念与理解&#xff1a; AIDL&#xff1a;Android Interface Definition Language 序列化&#x…

NVIDIA Jetson 项目:机器人足球比赛

推荐&#xff1a;使用 NSDT场景编辑器 助你快速搭建可二次编辑器的3D应用场景 事实上&#xff0c;整个比赛都致力于这个想法。RoboCup小型联盟&#xff08;SSL&#xff09;视觉停电技术挑战赛鼓励团队“探索本地传感和处理&#xff0c;而不是非车载计算机和全球摄像机感知环境的…

非结构化数据库-MinIO基本集成

是什么 MinIO 是一个高性能的分布式对象存储服务&#xff0c;适合存储非结构化数据&#xff0c;如图片&#xff0c;音频&#xff0c;视频&#xff0c;日志等。对象文件最大可以达到5TB。 安装启动 mkdir -p /usr/local/minio cd /usr/local/minio# 下载安装包 wget https:/…

Spring之AOP的特性

一. AOP简介 AOP是Aspect-Oriented Programming的缩写&#xff0c;即面向切面编程。利用oop思想&#xff0c;可以很好的处理业务流程&#xff0c;但是不能把系统中某些特定的重复性行为封装到模块中。例如&#xff0c;在很多业务中都需要记录操作日志&#xff0c;结果我们不得…

互联网的边缘与核心部分

边缘部分是用户直接使用&#xff0c;用来进行通信和资源共享。 核心部分由大量网络和连接网络的路由器组成。这部分是为边缘部分提供服务的。 边缘部分 处在互联网边缘的部分就是连接在互联网上的所有的主机。这些主机又称为端系统(end system)。 主机间的通信其实是进程间…

(三)行为型模式:3、解释器模式(Interpreter Pattern)(C++示例)

目录 1、解释器模式&#xff08;Interpreter Pattern&#xff09;含义 2、解释器模式的UML图学习 3、解释器模式的应用场景 4、解释器模式的优缺点 5、C实现解释器模式的实例 1、解释器模式&#xff08;Interpreter Pattern&#xff09;含义 解释器模式&#xff08;Interp…

WebSocket服务端数据推送及心跳机制(Spring Boot + VUE)

一、WebSocket简介 HTML5规范在传统的web交互基础上为我们带来了众多的新特性&#xff0c;随着web技术被广泛用于web APP的开发&#xff0c;这些新特性得以推广和使用&#xff0c;而websocket作为一种新的web通信技术具有巨大意义。WebSocket是HTML5新增的协议&#xff0c;它的…

Linux Vm上部署Docker

创建ubutu虚拟机并远程连接&#xff0c; 参考 https://blog.csdn.net/m0_48468018/article/details/132267096 在终端中切换到root用户&#xff0c;并安装docker服务 2.1 切换到root用户 sudo su2.2 安装docker服务 , 参考 https://docs.docker.com/engine/install/ubuntu/ …