【C++】023、移动语义深拷贝

发布时间:2026/8/6 4:51:03

【C++】023、移动语义深拷贝
一、移动语言是如何解决深拷贝的性能问题深拷贝会复制整个底层数据让源对象和目标对象都拥有自己独立的堆内存空间移动语义是转换底层资源的所有权将源对象的指针指向目标对象而不赋值底层数据时间复杂都为1移动语义将源对象的资源指针移动到目标对象并将源对象指针设置为nullptr这样源对象的析构操作就不会释放已经释放的资源了。二、代码示例移动构造函数与移动赋值操作符函数实现#include iostream #include cstring class MyString { private: char* m_data; size_t m_len; public: // ---------- 构造函数 ---------- MyString(const char* str ) : m_len(strlen(str)), m_data(new char[m_len 1]) { strcpy(m_data, str); } // ---------- 析构函数 ---------- ~MyString() { delete[] m_data; // 如果 m_data 是 nullptr安全无操作 } // // 1. 深拷贝构造O(n)昂贵 // MyString(const MyString other) : m_len(other.m_len), m_data(new char[m_len 1]) { strcpy(m_data, other.m_data); // 申请内存 复制数据 std::cout 深拷贝构造耗时 O(n) std::endl; } // // 2. 移动构造O(1)零开销 // MyString(MyString other) noexcept : m_data(other.m_data) // ① 窃取指针只复制地址 , m_len(other.m_len) { // ② 窃取长度 other.m_data nullptr; // ③ 关键置空源对象切断所有权 other.m_len 0; std::cout 移动构造O(1) 指针交换未复制任何数据 std::endl; } // // 3. 移动赋值O(1)对比深拷贝赋值 // MyString operator(MyString other) noexcept { if (this ! other) { delete[] m_data; // 释放自己的旧资源如果有 m_data other.m_data; // 窃取指针 m_len other.m_len; other.m_data nullptr; // 置空源对象 other.m_len 0; std::cout 移动赋值O(1) std::endl; } return *this; } };外部调用代码int main() { std::cout 场景1拷贝构造 vs 移动构造 std::endl; { MyString s1(HelloWorld); // 1. 普通构造分配堆内存 MyString s2(s1); // 2. 深拷贝构造申请新内存 复制10个字符 MyString s3(std::move(s1)); // 3. 移动构造只交换指针O(1) // 注意s1 现在是一个空壳m_data nullptr不能再读取其内容 // 如果取消下面这行注释程序会崩溃访问空指针。 // std::cout s1 内容: s1.c_str() std::endl; std::cout s2 内容: s2.c_str() (独立内存) std::endl; std::cout s3 内容: s3.c_str() (窃取了 s1 的资源) std::endl; } // 作用域结束s1(空)、s2、s3 各自析构不会双重释放 std::cout std::endl;三、移动语义操作中置空源对象的原因1、防止双重释放如果源对象的析构函数被调用时m_data还指向原来的地址他就会delete[]这块内存而目标对象也指向这块地址两个析构先后释放同一块内存进程立即崩溃。2、保证析构安全置空后源对象的析构函数执行delete[] m_data由于m_data是nullpdelete[]是无害的空操作。四、移动构造函数使用noexcept的原因C标准库承诺vector扩容必须提供强异常安全保证也就是扩容过程中如果抛出异常程序的状态必须安全地恢复到扩容前的状态但是移动构造函数会将源对象置为空了无法恢复所以加noexcept相当于向编译器承诺此操作不会抛异常让stl容器放心地使用移动从而达到最高性能。

相关新闻

MateBook E Go触摸屏故障分析与修复记录

MateBook E Go触摸屏故障分析与修复记录

2026/8/6 4:51:03

设备型号 GK-W7X | 主机名 matebookeGO | 记录日期 2026-08-05 最终状态:完成服务恢复和自动重启策略配置后,电脑已重新启动;用户确认触摸屏恢复正常。 结论:触摸屏硬件和 HID/SPI/I2C 设备链正常。直接故障是 HuaweiThpSer…

自然语言操控电脑 OpenClaw v2.9.0 Windows 与 Mac 双端部署指南

自然语言操控电脑 OpenClaw v2.9.0 Windows 与 Mac 双端部署指南

2026/8/6 4:51:03

🔥前言:Win11 环境运行 OpenClaw 必读说明 OpenClaw(因其图标形似小龙虾,在社区中常被昵称为"小龙虾")是一款备受瞩目的本地优先AI智能体项目。该项目基于开源协议开发,能够通过自然语言指令驱动…

本地离线 AI 智能体 OpenClaw v2.9.0 Windows 一键部署全流程

本地离线 AI 智能体 OpenClaw v2.9.0 Windows 一键部署全流程

2026/8/6 4:51:03

核心亮点:提供全程可视化的图形操作界面,自动补齐全套运行依赖,数据独立存储于本地设备,兼容多款主流大模型,并采用轻量化的 45.7MB 整合压缩包。 教程适配:OpenClaw | 适配 Windows 10/11 与 macOS 双系统…

CMOS模拟电路线性化技术:权衡艺术与工程实践

CMOS模拟电路线性化技术:权衡艺术与工程实践

2026/8/6 5:51:06

1. 项目概述:模拟设计中的线性化权衡艺术在模拟集成电路设计的核心地带,线性度一直是一个让人又爱又恨的指标。我们追求完美的线性响应,希望输出信号能忠实地、无失真地复现输入信号,但现实中的晶体管、电阻、电容等元件天生就是非…

TLS流量解密实战:从Wireshark配置到Flag提取全解析

TLS流量解密实战:从Wireshark配置到Flag提取全解析

2026/8/6 5:51:06

1. 项目概述:从加密流量中捕获Flag的实战意义在网络安全竞赛和日常渗透测试中,我们常常会遇到一个看似“无解”的场景:所有的网络通信都被TLS/SSL加密了,抓到的流量包就像一团乱码,关键的认证信息、命令执行结果或者那…

基于ddddocr与BurpSuite的验证码自动化识别与绕过实战

基于ddddocr与BurpSuite的验证码自动化识别与绕过实战

2026/8/6 5:51:06

1. 项目概述与核心价值 在渗透测试和Web应用安全评估中,登录、注册、找回密码等关键功能点前的验证码,常常是自动化攻击(如暴力破解、撞库)的主要防线。传统的BurpSuite Intruder模块虽然功能强大,但在面对图形验证码时…

Prompt Engineering与Context Engineering:AI后端架构中的核心差异与协同实践

Prompt Engineering与Context Engineering:AI后端架构中的核心差异与协同实践

2026/8/6 5:51:06

如果你正在准备2026年的大厂AI后端面试,或者正在设计一个基于大模型的智能应用,那么“Prompt Engineering”和“Context Engineering”这两个词一定高频出现。很多人以为它们只是“写提示词”和“管理上下文”的文字游戏,甚至觉得后者只是前者…

每日财经知识:博格公式选股——一个公式,筛出能长期持有的好公司(基于:TuShare API)

每日财经知识:博格公式选股——一个公式,筛出能长期持有的好公司(基于:TuShare API)

2026/8/6 5:51:06

原创 | 来自北方狼 StockStudy园地 | 2026年8月5日 17:41 重庆前置说明:如需要下载本文代码(共有 360M 左右,基础数据),请大家关注微信公众号:“StockStudy园地” 后台回复: 回复:基…

Agent终于能自己花钱了,Cloudflare钱包引爆抢注潮

Agent终于能自己花钱了,Cloudflare钱包引爆抢注潮

2026/8/6 5:41:06

8月5日,社交媒体刮起了一阵橙色旋风,不少博主在X上晒出了自己橙色的钱包ID。原来是“赛博活佛”Cloudflare在8月4日晚间推出面向AI Agent的可编程钱包Cloudflare Wallets,不仅让Agent具备自主参与互联网交易的能力,也让加密基础设…

ncmdumpGUI:一键解锁网易云音乐ncm文件的终极解决方案

ncmdumpGUI:一键解锁网易云音乐ncm文件的终极解决方案

2026/8/4 15:23:37

ncmdumpGUI:一键解锁网易云音乐ncm文件的终极解决方案 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否曾经从网易云音乐下载了心爱的歌曲&am…

分布式配置中心选型实战:Nacos与Consul在创业场景下的对比

分布式配置中心选型实战:Nacos与Consul在创业场景下的对比

2026/8/5 6:02:27

分布式配置中心选型实战:Nacos与Consul在创业场景下的对比工程导读:本文深入讨论 分布式配置中心选型实战:Nacos与Consul在创业场景下的对比 在生产工程实践中的核心落地方案。基于 分布式架构与微服务设计 视角,剖析实际痛点、架…

MoneyPrinterPlus实战指南:AI视频批量生成与自动化发布完整解决方案

MoneyPrinterPlus实战指南:AI视频批量生成与自动化发布完整解决方案

2026/8/5 8:19:55

MoneyPrinterPlus实战指南:AI视频批量生成与自动化发布完整解决方案 【免费下载链接】MoneyPrinterPlus AI一键批量生成各类短视频,自动批量混剪短视频,自动把视频发布到抖音,快手,小红书,视频号上,赚钱从来没有这么容易过! 支持本地语音模型chatTTS,fasterwhisper,…

Unity相机抖动插件Camera-Shake集成与应用实战指南

Unity相机抖动插件Camera-Shake集成与应用实战指南

2026/8/6 0:00:51

1. 项目概述与核心价值最近在做一个动作游戏,需要给主角的重击和爆炸场景加点料,让打击感更足。我第一时间就想到了给相机加个抖动效果,毕竟这是提升玩家沉浸感最简单直接的手段之一。自己手写一个也不是不行,但时间成本高&#x…

Cocos Creator 3.7微信小游戏开发:从架构设计到提审上线的全流程实战指南

Cocos Creator 3.7微信小游戏开发:从架构设计到提审上线的全流程实战指南

2026/8/6 0:00:51

1. 项目概述:为什么需要一份3.7版本的专属适配指南?如果你是一位使用Cocos Creator开发微信小游戏的开发者,并且项目正运行在3.7版本上,那么你很可能已经感受到了那份“甜蜜的烦恼”。一方面,Cocos Creator 3.7是一个功…

AI编程实战:从Prompt工程到工具链集成,打造高效开发工作流

AI编程实战:从Prompt工程到工具链集成,打造高效开发工作流

2026/8/6 0:00:51

1. 项目概述:一次开源AI编程课程的深度重构 最近,我把自己的开源AI编程课程《Claude Code》做了一次从里到外的大更新。如果你对利用Claude、Codex这类大模型来辅助编程感兴趣,或者正在寻找一个能跟上最新AI编码工具迭代节奏的学习路径&#…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/6 5:43:30

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/4 14:25:14

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/4 15:11:03

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…