深拷贝与浅拷贝

本文介绍了深拷贝与浅拷贝的概念,指出系统默认的拷贝构造函数可能导致的问题——当对象含有指向堆空间的数据时,浅拷贝可能会导致重复释放内存。为了解决这个问题,需要自定义拷贝构造函数实现深拷贝。通过示例代码展示了如何在C++中实现深拷贝的拷贝构造函数,确保对象间堆空间的独立性。同时,文章还提供了一个测试用例来演示正确使用深拷贝的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

深拷贝与浅拷贝

“Person05::Person05(char *,int)”: 无法将参数 1 从“const char [5]”转换为“char *”    Project1    
解决方法:右键项目 -> 属性 -> C/C++ -> 语言 -> 符合模式改成“否”

浅拷贝:系统默认提供的拷贝构造,做简单的值拷贝;
    如果属性里有指向堆空间的数据,那么简单的浅拷贝会导致重复释放内存的异常。
    解决该问题,需要自己提供拷贝构造函数,进行深拷贝。
    
深拷贝:指向不同的堆空间。拷贝构造:系统提供默认拷贝构造,是简单的值拷贝。
    用自己提供的拷贝构造:浅拷贝会释放堆区空间两次挂掉

class Person05 {
public:
    Person05() {//默认构造

    }
    //初始化属性
    Person05(char* name, int age) {
        m_Name = (char*)malloc(strlen(name) + 1);
        strcpy(m_Name, name);
        
        m_Age = age;
    }
    Person05(const Person05& p) {
        m_Age = p.m_Age;
        m_Name = (char*)malloc(strlen(p.m_Name) + 1);
        strcpy(m_Name, p.m_Name);
    }
    ~Person05() {
        cout << "析构函数。" << endl;
        if (m_Name != NULL) {
            free(m_Name);
            m_Name = NULL;
        }
    }
    char* m_Name;
    int m_Age;
};

void test5() {
    Person05 p1("敌法", 10);
    Person05 p2(p1);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值