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

c++深拷贝、浅拷贝

在 C++ 中,深拷贝和浅拷贝是两个重要的概念,尤其在涉及动态内存分配和指针成员时。这两个概念描述了对象复制时的行为。

浅拷贝

浅拷贝是指复制对象时,仅复制对象的基本数据成员,对于指针成员,只复制指针地址,即两个对象的指针成员指向同一块内存。浅拷贝的默认实现是通过编译器生成的拷贝构造函数和赋值运算符实现的。

示例代码
#include <iostream>class ShallowCopy {
public:int* data;// 构造函数ShallowCopy(int value) {data = new int(value);}// 拷贝构造函数(浅拷贝)ShallowCopy(const ShallowCopy& other) {data = other.data; // 仅复制指针}// 打印数据void print() const {std::cout << "Data: " << *data << std::endl;}// 析构函数~ShallowCopy() {delete data;}
};int main() {ShallowCopy obj1(10);ShallowCopy obj2 = obj1; // 浅拷贝obj1.print();obj2.print();return 0;
}

在这个例子中,obj1obj2data 指针指向同一块内存。这可能会导致在一个对象析构时,释放了另一个对象仍在使用的内存,从而引发未定义行为。

深拷贝

深拷贝是指复制对象时,不仅复制对象的基本数据成员,对于指针成员,分配新的内存并复制指针所指向的实际数据。深拷贝通常需要自定义拷贝构造函数和赋值运算符。

示例代码
#include <iostream>class DeepCopy {
public:int* data;// 构造函数DeepCopy(int value) {data = new int(value);}// 拷贝构造函数(深拷贝)DeepCopy(const DeepCopy& other) {data = new int(*other.data); // 分配新内存并复制数据}// 赋值运算符(深拷贝)DeepCopy& operator=(const DeepCopy& other) {if (this == &other) {return *this; // 防止自我赋值}delete data; // 释放旧内存data = new int(*other.data); // 分配新内存并复制数据return *this;}// 打印数据void print() const {std::cout << "Data: " << *data << std::endl;}// 析构函数~DeepCopy() {delete data;}
};int main() {DeepCopy obj1(10);DeepCopy obj2 = obj1; // 深拷贝obj1.print();obj2.print();*obj1.data = 20; // 修改 obj1 的数据obj1.print();obj2.print(); // obj2 的数据不受影响return 0;
}

在这个例子中,obj1obj2data 指针指向不同的内存块,因此修改 obj1 的数据不会影响 obj2

总结

  • 浅拷贝:仅复制指针地址,多个对象共享同一块内存,可能会导致资源管理问题。
  • 深拷贝:分配新的内存并复制数据,每个对象都有自己的独立内存,避免了资源管理问题。

在实际开发中,选择使用深拷贝还是浅拷贝,取决于具体的需求和对象的生命周期管理。对于需要独立管理资源的情况,深拷贝通常是更安全的选择。

http://www.lryc.cn/news/374835.html

相关文章:

  • k8s核心组件
  • 反编译腾讯vmp
  • Ollama:本地部署大模型 + LobeChat:聊天界面 = 自己的ChatGPT
  • JS中splice怎么使用
  • Flutter项目,Xcode15, 编译正常,但archive报错
  • 云动态摘要 2024-06-17
  • 【JavaScript脚本宇宙】图像处理新纪元:探索六大JavaScript图像处理库
  • 使用python调ffmpeg命令将wav文件转为320kbps的mp3
  • 程序启动 报错 no main manifest attribute
  • java-内部类 2
  • 【小技巧】pycharm中自动换行的实现
  • 如何修改倍福CX7000PLC IP地址
  • python安装flask,flask框架,使用静态文件、模板、get和post请求
  • Docker:Harbor
  • 2024 6.10~6.16 周报
  • clickhouse学习笔记(四)库、表、分区相关DDL操作
  • 聚焦现代商贸物流愿景 构筑供应链金融服务体系|第二届京津冀现代商贸物流金融创新发展百人大会成功举办
  • 解锁数据潜力:数据提取与治理的终极指南
  • 行列视(RCV)报表中的时间是如何处理的?
  • 成员变量和for循环里面的变量不冲突原因
  • 如何使用任意浏览器远程访问本地搭建的Jellyfin影音平台
  • CEM美国培安消解罐内管 CEM40位 55ML 微波消解罐
  • 使用 Selenium 保持登录会话信息
  • 程序员画图工具?那必然是你了!!【送源码】
  • k8s nginx.conf配置文件配置
  • XSKY 在金融行业:新一代分布式核心信创存储解决方案
  • 第9章 类
  • Elasticsearch 第二期:倒排索引,分析,映射
  • 函数的一点点习题
  • 使用Java计算Linux系统中sum命令得到的校验值