C++浅拷贝与深拷贝解析

#include <iostream>
using namespace std;

class Person
{
public:

    Person(int age){
        m_Age = age;
        cout<<"有参构造函数"<<endl;
    }
    Person(){
        cout<<"无参构造函数"<<endl;
    }
    Person(int age, int height)
    {
        m_Age = age;
        m_height = new int(height);
        cout<<"Person的有参函数构造调用"<<endl;
    }
    //自己实现拷贝函数的构造
    Person(const Person &p)
    {
        cout<<"Person 拷贝构造函数调用"<<endl;
        m_Age = p.m_Age;
        //m_height = p.m_height;//这里是浅拷贝操作,与age指向的是同一块内存单元,因此释放的时候出现段错误
        m_height = new int (*p.m_height);//这就是深拷贝
    }
    ~Person()
    {
        //进行堆区的释放
        if(m_height != NULL)
        {
            delete m_height;
            m_height = NULL;
        }
        cout<<"Person的析构函数调用"<<endl;
    }

    int m_Age;
    int * m_height;
};
void test01()
{
    Person p1(18, 160);
    cout<<"p1的年龄为:"<<p1.m_Age<<"身高为:"<<*p1.m_height<<endl;

    Person p2(p1);
    cout<<"p2的年龄为:"<<p2.m_Age<<"身高为:"<<*p2.m_height<<endl;
}
int main()
{
    test01();
    return 0;
}

例如:(1)浅拷贝:进行直接赋值操作。

m_height = p.m_height;
//这里是浅拷贝操作,与age指向的是同一块内存单元,因此释放的时候出现段错误

结果:

               图1. 浅拷贝结果

(2)深拷贝:需要进行new一块堆内存。

m_height = new int (*p.m_height);//这就是深拷贝

结果:

        图2. 深拷贝结果

2、为什么会出现:

       因为在p1和p2中m_height指向同一块内存空间,在调用函数析构时会析构两次,当第二次析构时就会出现错误,在不同的编译器中出现不同的结果,例如在QT中出现如图1所示错误,在visual stdio中程序会直接跑飞。          ​​​​​​​           ​​​​​​​        ​​​​​​​                               

       而在深拷贝中自己创建的堆区是一块新的堆内存,因此p1和p2指向的内存不一样,故析构函数会执行两次。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值