当前位置: 首页 > news >正文

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打破循环引用或实现弱引用关系。

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

相关文章:

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

1) 移动语义和拷贝语义的区别 拷贝语义和移动语义是C中对象所有权管理的两种机制&#xff0c;主要在对象初始化、赋值或传参时体现。 拷贝语义 (Copy Semantics) 行为&#xff1a;通过深拷贝或浅拷贝&#xff0c;创建一个新对象&#xff0c;并将原对象的值或资源复制到新对象…...

IEC61850实现方案和测试-2

IEC61850实现方案和测试-1作为介绍实现方案和测试的第二篇文章&#xff0c;后续会继续更新&#xff0c;欢迎关注。 第一篇是&#xff1a;IEC61850实现方案和测试-1-CSDN博客 UCA详细测试用例下载&#xff1a; 链接: https://pan.baidu.com/s/1TTMlYRfzKITgrkWwwtcrDg 提取码:…...

flume-将日志采集到hdfs

看到hdfs大家应该做什么&#xff1f; 是的你应该去把集群打开&#xff0c; cd /export/servers/hadoop/sbin 启动集群 ./start-all.sh 在虚拟机hadoop02和hadoop03上的conf目录下配置相同的日志采集方案&#xff0c;‘ cd /export/servers/flume/conf 切换完成之后&#…...

一文学习开源框架LeakCanary

LeakCanary 简介 LeakCanary 是一个由 Square 开发的开源工具&#xff0c;主要用于检测和诊断 Android 应用中的内存泄漏问题。它通过自动化的方式帮助开发者捕捉和分析可能导致内存泄漏的对象&#xff0c;简化了内存问题的排查过程。 LeakCanary 的功能 自动检测内存泄漏&a…...

jetson orin系列开发版安装cuda的gpu版本的opencv

opencv安装包下载地址&#xff1a; https://github.com/opencv/opencv/扩展库下载地址&#xff1a; https://github.com/opencv/opencv_contrib1. 删除jetpack包中的opencv版本 原先的opencv库安装在目录/usr/lib/aarch64-linux-gnu/下&#xff08;一般其他的第三方库也都安…...

数据结构-8.Java. 七大排序算法(中篇)

本篇博客给大家带来的是排序的知识点, 由于时间有限, 分两天来写, 中篇主要实现后三种排序算法: 冒泡排序,快速排序,下一篇讲 归并排序. 文章专栏: Java-数据结构 若有问题 评论区见 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作…...

数据结构C语言描述4(图文结合)--栈的实现,中序转后序表达式的实现

前言 这个专栏将会用纯C实现常用的数据结构和简单的算法&#xff1b;有C基础即可跟着学习&#xff0c;代码均可运行&#xff1b;准备考研的也可跟着写&#xff0c;个人感觉&#xff0c;如果时间充裕&#xff0c;手写一遍比看书、刷题管用很多&#xff0c;这也是本人采用纯C语言…...

python基本数据类型 -- 元组tuple

在 Python 中&#xff0c;元组&#xff08;Tuple&#xff09;是一种轻量级的、不可变的数据结构。与列表类似&#xff0c;元组用于存储有序的数据集合&#xff0c;但它一旦创建&#xff0c;其内容就无法更改。这种特性让元组在某些场景下更加安全和高效。本文将从定义、操作、应…...

tcpdump交叉编译

TCPDUMP在Libpcap上开发。 首先需要编译libcap。 网上那么多教程&#xff0c;下载地址都只给了一个英文的官网首页&#xff0c; 你尽可以试试&#xff0c;从里面找到下载地址都要费半天时间。 \color{red}网上那么多教程&#xff0c;下载地址都只给了一个英文的官网首页&#…...

Spring IOC注入方式、Bean作用域

Spring IOC注入 手动注入 set方法注入 需要提供set方法 public class UserService {private UserDao userDao; ​public void setUserDao(UserDao userDao) {this.userDao userDao;} } 设置属性字段的值 <bean id"userService" class"com.shsxt.servi…...

uniapp微信小程序转发跳转指定页面

onShareAppMessage 是微信小程序中的一个重要函数&#xff0c;用于自定义转发内容。当用户点击右上角的菜单按钮&#xff0c;并选择“转发”时&#xff0c;会触发这个函数。开发者可以在这个函数中返回一个对象&#xff0c;用于定义分享卡片的标题、图片、路径等信息。 使用场…...

利用uniapp开发鸿蒙:运行到鸿蒙模拟器—踩坑合集

从uniapp运行到鸿蒙模拟器上这一步&#xff0c;就有非常多的坑&#xff0c;一些常见的坑&#xff0c;官网都有介绍&#xff0c;就不再拿出来了&#xff0c;这里记录一下官网未记录的大坑 1.运行路径从hbuilderx启动鸿蒙模拟器 解决方法&#xff1a; Windows系统&#xff0c;官…...

【Vue】Vue3.0(二十五)Vue3.0中的具名插槽 的概念和使用场景

上篇文章 【Vue】Vue3.0&#xff08;二十四&#xff09;Vue3.0中 r e f s 、 refs 、 refs、parent 的概念和使用场景 &#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;Vue专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年11月20日16点30分 …...

【pytorch-02】:张量的索引、形状操作和常见运算函数

文章目录 1 张量索引1.1 简单行列索引和列表索引1.2 布尔索引和多维索引 2 张量的形状操作2.1 reshape函数2.2 transpose和permute函数的使用2.3 view和contiguous函数2.4 squeeze和unsqueeze函数用法2.5 张量更改形状小结 3 常见运算函数 1 张量索引 1.1 简单行列索引和列表索…...

C语言-指针作为函数返回值及二级指针

1、指针作为函数返回值 c语言允许函数的返回值是一个指针&#xff08;地址&#xff09;我们将这样的函数称为指针函数&#xff0c;下面的例子定义一了一个函数strlong&#xff08;&#xff09;&#xff0c;用来返回两个字符串中较长的一个&#xff1a; 1. #include <stdio…...

css 使用图片作为元素边框

先看原始图片 再看效果 边框的四个角灭有拉伸变形,但是图片的中部是拉伸的 代码 border-style: solid;/* 设置边框图像的来源 */border-image-source: url(/static/images/mmwz/index/bk_hd3x.png);/* 设置如何切割图像 */border-image-slice: 66;/* 设置边框的宽度 */border…...

Linux无sudo权限将zsh作为默认shell

由于我只有用户权限&#xff0c;没有sudo权限&#xff0c;将zsh作为用户默认shell需要密码&#xff0c;所以没法在系统层面进行操作&#xff0c;下面另寻他法。 安装zsh 可以根据网上教程去安装zsh&#xff0c;一般电脑上会带有zsh&#xff0c;可以使用下述命令查看是否安装z…...

【React 进阶】掌握 React18 全部 Hooks

一、数据更新驱动 1. useState 1. 基础介绍 useState主要用于声明和操作状态变量&#xff0c;可以使函数组件像类组件一样拥有state const [state, setState] useState(initialState);state&#xff1a;状态&#xff0c;作为渲染视图的数据源 setState&#xff1a;改变st…...

【卡尔曼滤波】数据预测Prediction观测器的理论推导及应用 C语言、Python实现(Kalman Filter)

【卡尔曼滤波】数据预测Prediction观测器的理论推导及应用 C语言、Python实现&#xff08;Kalman Filter&#xff09; 更新以gitee为准&#xff1a; 文章目录 数据预测概念和适用方式线性系统的适用性 数据预测算法和卡尔曼滤波公式推导状态空间方程和观测器先验估计后验估计…...

【SQL50】day 2

目录 1.每位经理的下属员工数量 2.员工的直属部门 3.判断三角形 4.上级经理已离职的公司员工 5.换座位 6.电影评分 7.修复表中的名字 8.患某种疾病的患者 9.删除重复的电子邮箱 1.每位经理的下属员工数量 # Write your MySQL query statement below #e1是经理&#xff0c;…...

临近毕业10款降AI率工具实测+避坑:到底哪个降AI率工具是真的有用

2025 年 12 月 25 日知网 AIGC 检测系统升级&#xff0c;2026 年 4 月 27 日维普 AI 率检测平台升级…2026 毕业季&#xff0c;各大主流 AIGC 检测软件陆续升级系统&#xff0c;识别 AI 痕迹更加精准。 临近毕业&#xff0c;同学们看者飘红的 AIGC 检测报告、纷繁复杂的降 AI 系…...

星露谷物语SMAPI模组加载器:终极安装与使用完整指南

星露谷物语SMAPI模组加载器&#xff1a;终极安装与使用完整指南 【免费下载链接】SMAPI The modding API for Stardew Valley. 项目地址: https://gitcode.com/gh_mirrors/smap/SMAPI 你是否想在星露谷物语中体验数百个模组带来的无限可能&#xff0c;却又担心安装复杂和…...

别再用土办法改论文了!书匠策AI官网www.shujiangce.com才是2025届毕业生的“通关密码“

你有没有经历过这种崩溃瞬间&#xff1f; 凌晨两点&#xff0c;你对着电脑屏幕&#xff0c;查重率39%&#xff0c;AIGC疑似率67%。导师发来一条消息&#xff1a;"这篇不像你写的&#xff0c;重写。" 那一刻&#xff0c;你是不是特别想问一句&#xff1a;我到底该怎…...

在数据分析和报告自动化场景中集成Taotoken调用大模型

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 在数据分析和报告自动化场景中集成Taotoken调用大模型 数据分析与报告生成是许多团队日常工作中的高频任务。传统流程中&#xff0…...

大规模矩阵SVD与GSVD计算方法【附代码】

✨ 长期致力于办公建筑设计、建筑能耗、光性能、热性能、modeFRONTIER、多目标优化、性能模拟、寒冷地区研究工作&#xff0c;擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流&#xff0c;点击《获取方式》 &#xff08;1&#xff…...

Wedding-website开发者指南:理解项目架构与代码实现原理

Wedding-website开发者指南&#xff1a;理解项目架构与代码实现原理 【免费下载链接】wedding-website Our Wedding Website &#x1f46b; 项目地址: https://gitcode.com/gh_mirrors/we/wedding-website Wedding-website是一个专为婚礼设计的开源网站项目&#xff0c;…...

插电式混合动力公交车工况预测与智能能量管理策略【附程序】

✨ 长期致力于插电式混合动力系统、行驶工况构建、工况预测、预测能量管理策略、智能能量管理策略研究工作&#xff0c;擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流&#xff0c;点击《获取方式》 &#xff08;1&#xff09;自组…...

Tomcat DefaultServlet MIME类型处理缺陷导致信息泄露

1. 这个漏洞不是“能读文件”那么简单&#xff0c;而是Tomcat在特定配置下主动把不该暴露的内部状态当HTTP响应发出去了CVE-2024-21733这个编号刚出来时&#xff0c;我第一反应是又一个“目录遍历”或“文件读取”类的老套路。但真正花半天时间搭环境复现、抓包分析、翻Tomcat源…...

UE5 BaseHardware.ini硬件兼容性判决机制深度解析

1. 这不是配置文件&#xff0c;而是UE5硬件适配的“宪法性文档”很多人第一次在Unreal Engine 5项目里翻到BaseHardware.ini&#xff0c;下意识就把它当成普通ini配置——改几个数值、调个开关、重启编辑器完事。我刚接手一个跨平台渲染优化项目时也这么干过&#xff1a;把bUse…...

2026年度AI接入方案复盘:六大主流API中转/API聚合平台深度测评与选型建议

2026年度AI接入方案复盘&#xff1a;六大主流API中转平台深度测评与选型建议 站在2026年的技术节点回望&#xff0c;企业在构建大模型应用时&#xff0c;早已告别了单纯追求低价的阶段。经过一整年的行业沉淀&#xff0c;我们发现真正影响生产效率的并非单一Token的成本&#…...