C/C++基础知识复习(27)

1) 移动语义和拷贝语义的区别

拷贝语义移动语义是C++中对象所有权管理的两种机制,主要在对象初始化、赋值或传参时体现。

拷贝语义 (Copy Semantics)
  • 行为:通过深拷贝浅拷贝,创建一个新对象,并将原对象的值或资源复制到新对象。
  • 应用场景:用于保证两个对象完全独立,尤其是在需要保留源对象时。
  • 特点
    • 使用拷贝构造函数 (T(const T&)) 或拷贝赋值运算符 (T& operator=(const T&))。
    • 原对象和副本对象都拥有资源的独立副本。
    • 适合没有涉及动态资源管理的简单类。

例子

std::string str1 = "Hello"; std::string str2 = str1; // 拷贝语义:str2是str1的副本
移动语义 (Move Semantics)
  • 行为:通过转移资源所有权,避免不必要的拷贝,提高性能。
  • 应用场景:适用于临时对象(如返回值或右值),当源对象可以丢弃时。
  • 特点
    • 使用移动构造函数 (T(T&&)) 或移动赋值运算符 (T& operator=(T&&))。
    • 源对象的资源被转移给目标对象,通常源对象会被重置为默认状态。
    • 大幅减少资源分配和释放的开销。

例子

std::string str1 = "Hello"; 
std::string str2 = std::move(str1); 
// 移动语义:str2接管了str1的资源,str1可能为空
区别对比
特点拷贝语义移动语义
是否创建新资源否(资源转移)
性能开销高(需要分配新资源并复制内容)低(只转移指针或资源句柄)
资源所有权独立拥有目标对象接管源对象资源
使用条件源对象不可丢弃源对象可丢弃或不需要再使用

2) 什么是C++中的智能指针?有哪些类型的智能指针?

智能指针 (Smart Pointer)
  • 智能指针是C++标准库(<memory>)提供的一种类模板,用于自动管理动态分配的内存资源。
  • 它通过RAII(资源获取即初始化)机制,自动在合适的时机释放内存,避免内存泄漏。
  • 智能指针包装了原生指针,支持类似指针的操作(如*->),但拥有更安全和自动化的内存管理。

常见类型的智能指针
  1. std::unique_ptr

    • 特点
      • 独占所有权:一个unique_ptr对象独享其管理的资源,不能被复制。
      • 只能通过移动语义转移资源所有权。
    • 适用场景:需要独占资源且生命周期明确的场景。
    • 例子
      std::unique_ptr<int> p1 = std::make_unique<int>(42); 
      std::unique_ptr<int> p2 = std::move(p1); // p1失效,p2接管资源
  2. std::shared_ptr

    • 特点
      • 共享所有权:多个shared_ptr可以共享同一资源,资源会在最后一个shared_ptr销毁时自动释放。
      • 内部通过引用计数跟踪资源的使用。
    • 适用场景:需要多个对象共享同一资源的场景。
    • 例子
      std::shared_ptr<int> p1 = std::make_shared<int>(42); 
      std::shared_ptr<int> p2 = p1; // p1和p2共享同一资源
  3. std::weak_ptr

    • 特点
      • 弱引用:不影响资源的引用计数,只能与shared_ptr配合使用。
      • 可用于打破循环引用。
    • 适用场景:需要观测资源状态但不控制资源生命周期的场景。
    • 例子
      std::shared_ptr<int> shared = std::make_shared<int>(42); 
      std::weak_ptr<int> weak = shared; 
      // 不增加引用计数 
      if (auto sp = weak.lock()) {// 检查资源是否仍然有效 
      std::cout << *sp << std::endl; 
      }


智能指针的选择建议
  • 使用std::unique_ptr管理独占资源。
  • 使用std::shared_ptr在共享资源场景中。
  • 使用std::weak_ptr打破循环引用或实现弱引用关系。

通过合理使用智能指针,可以显著减少手动内存管理带来的复杂性和错误风险。

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

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

相关文章

学习与理解LabVIEW中多列列表框项名和项首字符串属性

多列列表框控件在如下的位置&#xff1a; 可以对该控件右击&#xff0c;如下位置&#xff0c;即可设置该控件的显示项&#xff1a; 垂直线和水平线指的是上图中组成单元格的竖线和横线&#xff08;不包括行首列首&#xff09; 现在介绍该多列列表框的两个属性&#xff0c;分别…

【信息系统项目管理师】第2章:信息技术发展 考点梳理

文章目录 2.1 信息技术及其发展2.1.1 计算机软硬件2.1.2 计算机网络2.1.3 存储和数据库2.1.4 信息安全2.1.5 信息技术的发展 2.2 新一代信息技术及应用2.2.1 物联网2.2.2 云计算2.2.3 大数据2.2.4 区块链2.2.5 人工智能2.2.6 虚拟现实 2.1 信息技术及其发展 2.1.1 计算机软硬件…

《现代制造技术与装备》是什么级别的期刊?是正规期刊吗?能评职称吗?

​问题解答 问&#xff1a;《现代制造技术与装备》是不是核心期刊&#xff1f; 答&#xff1a;不是&#xff0c;是知网收录的第二批认定学术期刊。 问&#xff1a;《现代制造技术与装备》级别&#xff1f; 答&#xff1a;省级。主管单位&#xff1a;齐鲁工业大学&#xff0…

QT:QListView实现table自定义代理

介绍 QListVIew有两种切换形式&#xff0c;QListView::IconMode和QListView::ListMode&#xff0c;通过setViewMode()进行设置切换。因为QListView可以像QTreeView一样显示树形结构&#xff0c;也可以分成多列。这次目标是将ListView的ListMode形态显示为table。使用代理&…

统计学常用的分析方法:T检验

T检验是一种用于比较数据集均值差异的统计方法&#xff0c;包括单样本t检验、配对样本t检验和独立样本t检验&#xff0c;可通过MATLAB、Python和R等工具实现t检验。如果数据不符合正态分布&#xff0c;可考虑使用非参数分析&#xff0c;多余两组数据时&#xff0c;可采用多重比…

win10中使用ffmpeg和MediaMTX 推流rtsp视频

在win10上测试下ffmpeg推流rtsp视频&#xff0c;需要同时用到流媒体服务器MediaMTX 。ffmpeg推流到流媒体服务器MediaMTX &#xff0c;其他客户端从流媒体服务器拉流。 步骤如下&#xff1a; 1 下载MediaMTX github: Release v1.9.3 bluenviron/mediamtx GitHub​​​​​…

网络安全-web架构-nginx配置

1. nginx访问&#xff1a; 访问的是index.html&#xff0c; 访问ip访问的资源就是在/usr/share/nginx/html中&#xff1b; 当nginx不认识&#xff0c;浏览器认识的话&#xff0c;浏览器会自动渲染。 当nginx认识&#xff0c;浏览器不认识的话&#xff0c;浏览器会把它加载成…

Python + 深度学习从 0 到 1(00 / 99)

希望对你有帮助呀&#xff01;&#xff01;&#x1f49c;&#x1f49c; 如有更好理解的思路&#xff0c;欢迎大家留言补充 ~ 一起加油叭 &#x1f4a6; 欢迎关注、订阅专栏 【深度学习从 0 到 1】谢谢你的支持&#xff01; ⭐ 什么是深度学习&#xff1f; 人工智能、机器学习与…

Chinese SimpleQA:包含3000个高质量问题,覆盖6个主要主题,每个主题下有99个细分主题,用来评估大型语言模型中文事实性能力的基准测试.

2024-11-12, 由阿里巴巴集团旗下的淘宝和天猫团队创建的Chinese SimpleQA数据集&#xff0c;是首个全面评估语言模型回答简短问题事实性能力的中文基准测试。该数据集的创建&#xff0c;为理解和提升大型语言模型在中文环境下的事实性回答能力提供了重要的工具和标准。 数据集…

Kafka 生产者优化与数据处理经验

Kafka&#xff1a;分布式消息系统的核心原理与安装部署-CSDN博客 自定义 Kafka 脚本 kf-use.sh 的解析与功能与应用示例-CSDN博客 Kafka 生产者全面解析&#xff1a;从基础原理到高级实践-CSDN博客 Kafka 生产者优化与数据处理经验-CSDN博客 Kafka 工作流程解析&#xff1a…

Python中Tushare(金融数据库)入门详解

文章目录 Python中Tushare&#xff08;金融数据库&#xff09;入门详解一、引言二、安装与注册1、安装Tushare2、注册与获取Token 三、Tushare基本使用1、设置Token2、获取数据2.1、获取股票基础信息2.2、获取交易日历2.3、获取A股日线行情2.4、获取沪股通和深股通成份股2.5、获…

shell第一次作业

要求&#xff1a; 通过shell脚本分析部署nginx网络服务 1.接收用户部署的服务名称 2.判断服务是否安装 ​ 已安装&#xff1b;自定义网站配置路径为/www&#xff1b;并创建共享目录和网页文件&#xff1b;重启服务 ​ 没有安装&#xff1b;安装对应的软件包 3.测试 判断服务是…

1+X应急响应(网络)病毒与木马的处置:

病毒与木马的处置&#xff1a; 病毒与木马的简介&#xff1a; 病毒和木马的排查与恢复&#xff1a;

服务器数据恢复—热备盘未激活导致硬盘掉线的raid5阵列崩溃的数据恢复案例

服务器数据恢复环境&#xff1a; 某品牌X3850服务器中有一组由数块SAS硬盘组建的RAID5阵列&#xff0c;该阵列中有一块盘是热备盘。操作系统为linux redhat&#xff0c;上面跑着一个基于oracle数据库的oa。 服务器故障&#xff1a; 服务器raid5阵列中有一块硬盘离线&#xff0…

Eclipse 创建Dynamic web project项目-配置Tomcat服务器

1、new——>project: 2、选择web的 Dynamic web project项目: 3、 项目命名&#xff0c;选择new runtime(没有部署过web项目&#xff0c;一般tartget runtime选项里面是空的)&#xff1a; 4、完成1、2的路径选择&#xff1a; 5、完成两个选项操作后&#xff0c;点击finish &…

理解折半查找法

理解折半查找法&#xff1a;高效的查找算法 折半查找法&#xff08;又称二分查找法&#xff09;是一种高效的查找算法&#xff0c;用于查找一个已排序数组中的目标元素。与线性查找方法不同&#xff0c;折半查找每次都将搜索范围减半&#xff0c;从而大幅提升查找效率。本文将详…

VM虚拟机装MAC后无法联网,如何解决?

✨在vm虚拟机上&#xff0c;给虚拟机MacOS设置网络适配器。选择NAT模式用于共享主机的IP地址 ✨在MacOS设置中设置网络 以太网 使用DHCP ✨回到本地电脑上&#xff0c;打开 服务&#xff0c;找到VMware DHCP和VMware NAT&#xff0c;把这两个服务打开&#xff0c;专一般问题就…

力扣 LeetCode 236. 二叉树的最近公共祖先(Day10:二叉树)

解题思路&#xff1a; 后序遍历 注意&#xff1a; p和q其中一个就是它们的公共祖先的情况也考虑到了&#xff0c;假设q是公共祖先&#xff0c;遇到q就直接返回&#xff0c;相当于是下面一边为空&#xff0c;一边不为空的情况&#xff0c;返回不为空就一边即可 class Solutio…

前端速通(HTML)

1. HTML HTML基础&#xff1a; 什么是HTML&#xff1f; 超文本&#xff1a; "超文本"是指通过链接连接不同网页或资源的能力。HTML支持通过<a>标签创建超链接&#xff0c;方便用户从一个页面跳转到另一个页面。 标记语言&#xff1a; HTML使用一组预定义的标签…

论文阅读——Performance Evaluation of Passive Tag to Tag Communications(一)

文章目录 摘要一、互耦对监听器标签输入阻抗的影响A. 无限细偶极子互阻抗的理论研究B. 电细偶极子的情况&#xff1a;理论与模拟C. 印刷偶极子的情况&#xff1a;电磁模拟与测量 二、T2T 通信系统的性能评估总结 论文来源&#xff1a;https://ieeexplore.ieee.org/document/970…