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

【C++】深拷贝与浅拷贝

重开也不是不可能 ~.~

浅拷贝

#include <iostream>
#include <cstring>

class ShallowCopyExample {
public:
    int m_nValue;
    int* m_pData;

    // 构造函数,初始化指针成员
    ShallowCopyExample(int value) : m_nValue(value) {
        m_pData = new int(0);
        *m_pData = value;
    }

    // 析构函数,释放指针内存
    ~ShallowCopyExample() {
        delete m_pData;
        m_pData = nullptr;
    }
};

int main() {
    ShallowCopyExample obj1(10);
    ShallowCopyExample obj2 = obj1; // 使用默认的浅拷贝构造函数

    // 修改obj2的指针成员指向的值,obj1的指针成员指向的值也会随之改变
    *obj2.m_pData = 20;

    // 输出obj1和obj2的指针成员指向的值
    std::cout << "*obj1.m_pData: " << *obj1.m_pData << std::endl; // 输出20
    std::cout << "*obj2.m_pData: " << *obj2.m_pData << std::endl; // 输出20
    
    return 0;
}
    //当程序结束时,obj1和obj2的析构函数会先后调用,导致m_pData被释放两次,引发未定义行为

 深拷贝

#include<iostream>
class DeepCopyExample {
public:
    int m_nValue;
    int* m_pData;

    // 构造函数
    DeepCopyExample(int value) : m_nValue(value) {
        m_pData = new int(0);
        *m_pData = value;
    }

    // 深拷贝构造函数
    DeepCopyExample(const DeepCopyExample& other) : m_nValue(other.m_nValue) {
        m_pData = new int(*other.m_pData); // 重新分配内存并复制数据
    }

    // 析构函数
    ~DeepCopyExample() {
        delete m_pData;
        m_pData = nullptr;
    }
};

int main() {
    DeepCopyExample obj1(10);
    DeepCopyExample obj2 = obj1; // 使用深拷贝构造函数

    // 修改obj2的指针成员指向的值
    *obj2.m_pData = 20;

    // 输出obj1和obj2的指针成员指向的值
    std::cout << "*obj1.m_pData: " << *obj1.m_pData << std::endl; // 输出10
    std::cout << "*obj2.m_pData: " << *obj2.m_pData << std::endl; // 输出20

    return 0;
}

 深拷贝与浅拷贝的区别

C++拷贝最佳实践 

相关文章:

  • GitHub 趋势日报 (2025年04月08日)
  • C语言精讲-12
  • 【Linux】基础开发工具
  • 八大可商用桌面客户端应用开发框架深度指南-优雅草卓伊凡
  • 操作系统基础:05 系统调用实现
  • playwright 教程高级篇:掌握网页自动化与验证码处理等关键技术详解
  • [数据结构]排序 --2
  • 【C++】C++的引用
  • 在 Ubuntu 下通过 Docker 部署 Caddy 服务器
  • C++双链表介绍及实现
  • 从输入URL到页面渲染:浏览器请求的完整旅程解析
  • LLM学习笔记3——使用Docker(vLLM+OpenWebUI)实现本地部署DeepSeek-R1-32B模型
  • 基于HASM模型的高精度建模matlab仿真
  • Go 跨域中间件实现指南:优雅解决 CORS 问题
  • 十五、C++速通秘籍—异常处理
  • 基于Python的经济循环模型构建与可视化案例
  • Matlab添加标题title与标签lable
  • 上层 Makefile 控制下层 Makefile 的方法
  • 解释型语言和编译型语言的区别
  • 安全岗の夺命连环问:(第壹篇)从XSS到0day的灵魂拷问
  • 洗冤录|县令遇豪强:黄榦处理的一起地产纠纷案
  • 韩德洙成为韩国执政党总统大选候选人
  • 奥园集团将召开债券持有人会议,拟调整“H20奥园2”本息兑付方案
  • 从“重规模”向“重回报”转变,公募基金迎系统性改革
  • 紧盯大V、网红带货肉制品,整治制售假劣肉制品专项行动开展
  • 民生访谈|摆摊设点、公园搭帐篷、行道树飘絮,管理难题怎么解?