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

软件工程学习日志2025.11.4

🌟 主题: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.jsqmd.com/news/31438/

相关文章:

  • 深入理解Django 视图与 URL 路由:从基础到实战 - 指南
  • 三驾马车优化版 v9.13
  • 完整教程:【论文阅读】-《SparseFool: a few pixels make a big difference》
  • 专为开发者量身打造!!!摆脱 GitHub、GitLab、Hugging Face等平台龟速下载?
  • go语言访问新浪股票
  • Hugging Face的基础使用
  • Python私教FastAPI+React构建Web应用03 FARM技术栈介绍 - 教程
  • 2025上海SAT线上培训机构推荐:线上课程首选“无老师国际教育”
  • Ecelipse 安装 MAT
  • 【时序数据库 IoTDB 线上小课 20】4 分钟了解 IoTDB MCP:让 AI 对话时序数据
  • latex使用过程中,需要按照期刊要求进行调整的办法(随时更新)
  • 高级语言程序第三次作业 - 102300317
  • 2025-11-04 早报新闻
  • Scaling Law至现有AI即将跌落神坛?AI大模型的“增长神话”是否正在崩塌-上篇 - 实践
  • 基于华为ENSP学习网络
  • The 2024 ICPC Asia Nanjing Regional Contest (The 3rd Universal Cup. Stage 16: Nanjing) 题解
  • .NET 8项目下载所有依赖到指定目录
  • su命令引起的nohup进程以root身份启动导致的问题
  • 2025年学生会团体服定制厂家推荐:靠谱团体服定制企业全解析
  • 博客文章map
  • 注册绑卡augment,免费试用一年教程--稳
  • 2025年不锈钢定制加盟公司推荐:不锈钢门定制工厂口碑榜介绍
  • 完整教程:四大名著智能可视化推演平台
  • 2025年重庆正宗陈麻花品牌口碑排名:陈建平麻花客户评价如何、性价比怎么样、价格合理吗全解析
  • 2025 年留学机构最新推荐排行榜:英美澳加等国申请权威指南,老牌与新锐机构优选名单加拿大留学 / 留学中介 / 留学咨询推荐
  • Introduction to Microsoft Visual C++/MFC
  • C++字符串选择char数组还是std::string比较
  • fastadmin配合宝塔面板造成cors error 跨域问题
  • 2025年系统门窗定制厂家权威推荐榜单:品牌/系统门窗源头厂家、专业定制厂家精选
  • 12 Kodi