软件工程学习日志2025.11.4

news/2025/11/4 18:43:49/文章来源:https://www.cnblogs.com/dynastyeast/p/19191134

🌟 主题:C++中的资源管理与克隆技术

  1. 今日学习目标

今天重点研究C++中的动态内存管理和对象克隆技术,通过实现一个完整的向量类来深入理解:
• 动态内存的申请与释放

• 浅克隆与深克隆的实现原理

• 两种克隆方式的适用场景比较

  1. 核心代码实现

2.1 向量类的基本结构

class Vector {
private:
double* data; // 动态数组指针
int size; // 向量大小

public:
// 构造函数系列
Vector(); // 默认构造
Vector(int size); // 指定大小构造
Vector(const Vector& other); // 拷贝构造(深拷贝)
Vector(const Vector& other, bool deepCopy); // 克隆构造

// 克隆方法
Vector shallowClone() const;        // 浅克隆
Vector deepClone() const;           // 深克隆// 其他功能方法...

};

2.2 关键实现细节

深克隆构造函数:
Vector(const Vector& other, bool deepCopy) : size(other.size) {
if (deepCopy) {
// 分配新内存并复制数据
data = new double[other.size];
memcpy(data, other.data, other.size * sizeof(double));
} else {
// 共享数据指针
data = other.data;
}
}

  1. 浅克隆 vs 深克隆:本质区别

3.1 内存布局对比

浅克隆(共享内存):
对象A [data: 0x1000] ───┐
├─→ [1.0, 2.0, 3.0]
对象B [data: 0x1000] ───┘

深克隆(独立内存):
对象A [data: 0x1000] ──→ [1.0, 2.0, 3.0]
对象B [data: 0x2000] ──→ [1.0, 2.0, 3.0]

3.2 核心差异总结表

特性 浅克隆 深克隆

内存占用 少(共享数据) 多(独立副本)

创建速度 快(仅复制指针) 慢(复制所有数据)

数据安全性 低(相互影响) 高(完全隔离)

适用场景 只读访问、临时使用 需要独立修改

  1. 实际测试演示

4.1 测试代码片段

void testClones() {
Vector original(3);
original.setValue(0, 10.0);

Vector shallow = original.shallowClone();
Vector deep = original.deepClone();// 修改原始对象
original.setValue(0, 99.0);cout << "原始向量: " << original.getValue(0) << endl;  // 输出 99.0
cout << "浅克隆: " << shallow.getValue(0) << endl;    // 输出 99.0(受影响!)
cout << "深克隆: " << deep.getValue(0) << endl;       // 输出 10.0(不受影响)

}

4.2 运行结果分析

原始向量第一个元素: 99
浅克隆第一个元素: 99 ← 值被改变!
深克隆第一个元素: 10 ← 保持原值

指针地址比较:
原始向量: 0x1000
浅克隆: 0x1000 ← 地址相同
深克隆: 0x2000 ← 地址不同

  1. 深度思考

5.1 为什么需要两种克隆方式?

浅克隆的优势:
• 创建速度快,适合大规模对象复制

• 内存效率高,适合只读场景

• 可以实现数据共享机制

深克隆的必要性:
• 数据安全性和独立性

• 避免悬空指针问题

• 符合值语义的期望

5.2 实际应用场景

使用浅克隆的情况:
• 函数参数传递(避免不必要的复制)

• 临时对象处理

• 只读数据视图

使用深克隆的情况:
• 需要独立修改的对象副本

• 线程安全的数据处理

• 持久化数据存储

  1. 编程规范实践

在今天的学习中,特别注意了以下规范:

6.1 资源管理

• RAII原则:构造函数申请资源,析构函数释放资源

• 异常安全:使用try-catch处理边界情况

6.2 代码可读性

• 清晰的注释说明

• 有意义的命名规范

• 合理的函数分组

6.3 内存安全

• 防止内存泄漏

• 避免悬空指针

• 检查自赋值情况

  1. 今日收获总结

  2. 技术理解:深刻理解了浅克隆和深克隆的内在机制和适用场景

  3. 实践能力:通过完整实现加深了对C++动态内存管理的掌握

  4. 设计思维:学会了根据具体需求选择合适的克隆策略

  5. 明日学习计划
    研究C++11的移动语义和右值引用

实现带有移动构造函数的向量类

比较拷贝与移动的性能差异

💡 每日箴言

"理解内存管理是成为高级C++程序员的关键一步。浅克隆与深克隆的选择体现了在性能与安全之间的权衡艺术。"

今日编码时长: 3小时
代码行数: 约200行
掌握程度: ✅ 熟练掌握

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

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

相关文章

深入理解Django 视图与 URL 路由:从基础到实战 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

三驾马车优化版 v9.13

""" Cibo 三驾马车优化版 策略1:小市值策略 策略2:ETF反弹策略 (只能测试 23.9月后, 2000etf上市时间为23.9) 策略3:ETF轮动策略 策略4:白马攻防 v2.0写在最前面 实盘相关的指引: https://www.join…

完整教程:【论文阅读】-《SparseFool: a few pixels make a big difference》

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

专为开发者量身打造!!!摆脱 GitHub、GitLab、Hugging Face等平台龟速下载?

嗨,我是小华同学,专注解锁高效工作与前沿AI工具!每日精选开源技术、实战技巧,助你省时50%、领先他人一步。👉免费订阅,与10万+技术人共享升级秘籍!“想摆脱 GitHub、GitLab、Hugging Face 等平台龟速下载?Xge…

go语言访问新浪股票

package mainimport ("encoding/json""fmt""io""log""net/http""os""time" )// StockData 定义股票数据结构 type StockData struct {Symbol …

Hugging Face的基础使用

The AI community building the future.介绍 主流开源大模型平台对比HuggingFace:类 GitHub,模型资源全面,但对新手来说难以访问。 ModelScope(阿里开源):模型资源较有限,访问速度快。HuggingFace 优点丰富的预…

Python私教FastAPI+React构建Web应用03 FARM技术栈介绍 - 教程

Python私教FastAPI+React构建Web应用03 FARM技术栈介绍 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Con…

2025上海SAT线上培训机构推荐:线上课程首选“无老师国际教育”

2025上海SAT线上培训机构推荐:线上课程首选“无老师国际教育” 对于身处上海的备考学生而言,面对繁忙的学业压力和激烈的竞争环境,选择一个高效、灵活且教学质量卓越的SAT线上辅导机构至关重要。结合2025年SAT机考改…

Ecelipse 安装 MAT

Ecelipse 安装 MAT最近内存溢出,OOM。莫名其妙。 需要安装分析工具,其中据说比较好用的是Eclipse安装MAT。 内存分析过程: 1、生成JVM快照。 2、下载快照到本地。 3、打开ecliplse,使用MAT分析快照,打开模式Memor…

Java基础加强13-集合框架、Stream流 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

【时序数据库 IoTDB 线上小课 20】4 分钟了解 IoTDB MCP:让 AI 对话时序数据

IoTDB MCP 助力时序数据智能化管理!时序数据 x AI,新玩法来了! 💡对话式交互,让 AI “秒懂”时序数据,时序数据库 IoTDB 的 MCP Server 已被多个网站收录! 📢【IoTDB 视频小课】第二十期,4 分钟带你玩转 MC…

latex使用过程中,需要按照期刊要求进行调整的办法(随时更新)

1.双倍行距常见latex模板,加载\usepackage{setspace} 并在\begin{document}之前一行输入\doublespacing,最好再空一行即可。 对于cas-cs模板(复杂模板),需要在\maketitle之后,正文之前输入\doublespacing。2.行号…

高级语言程序第三次作业 - 102300317

C语言03次作业这个作业属于哪个课程 2025高级语言程序设计 (福州大学)这个作业要求在哪里 高级语言程序设计课程第三次个人作业学号 102300317姓名 李东阳第四章4.8编程练习: 2、3、4、6、7、8、第五章5.11编程练习题…

Scaling Law至现有AI即将跌落神坛?AI大模型的“增长神话”是否正在崩塌-上篇 - 实践

Scaling Law至现有AI即将跌落神坛?AI大模型的“增长神话”是否正在崩塌-上篇 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; f…

基于华为ENSP学习网络

前言 网络设备 路由器 实现多台PC不同网段通信 网络拓扑路由器配置配置路由器实现多台PC不同网段通信 # 进入配置模式system# 修改路由器名称sysname name(路由器名称)# 进入相关接口interface g0/0/0# 配置IP地址ip …

The 2024 ICPC Asia Nanjing Regional Contest (The 3rd Universal Cup. Stage 16: Nanjing) 题解

The 2024 ICPC Asia Nanjing Regional Contest (The 3rd Universal Cup. Stage 16: Nanjing) 题解 目录The 2024 ICPC Asia Nanjing Regional Contest (The 3rd Universal Cup. Stage 16: Nanjing) 题解Problem A. Hey…

.NET 8项目下载所有依赖到指定目录

通过下载的命令,可以下载所有的依赖包: dotnet restore --packages ./packages如果是针对工程级别的,在工程根目录下运行,会收集工程下所有项目的依赖包。 如果是针对项目级别的,在项目根目录下运行,会收集项目所…

su命令引起的nohup进程以root身份启动导致的问题

如果你使用.sh脚本,并且命令是使用脚本里的内容,nohup等命令启动的Java服务。 又并且你是使用了su - username切换过来的终端环境。 原因就是我使用su - zhangsan命令切换到张三的命令终端下, 但是在使用脚本start.…

2025年学生会团体服定制厂家推荐:靠谱团体服定制企业全解析

校园活动的仪式感,往往始于一件印着专属LOGO的团体服——它是学生会招新时的门面担当,是社团活动时的身份标识,更是毕业季里的青春纪念册。然而,学生会定制团体服时,常被起订量高、质量参差、设计粗糙等问题困扰。…