简述:浅拷贝与深拷贝问题

默认的拷贝构造函数仅仅是进行数据赋值,并不能为指针开辟内存空间

那么本质上就是两个指针指向同一处空间

当程序结束时,两个对象回收调用自己的析构函数,释放这块内存空间,由于两个对象要调用两次(即delete两次),就会出现错误!

所以,当类中有指针类型时,依靠默认的拷贝构造函数的方法,已经无法满足我们的需求,必须定义一个特定的拷贝构造函数。

即不仅可以进行数据的拷贝,也可以为成员分配内存空间,实现真正的拷贝,也叫做深拷贝,这就是深拷贝构造函数。

简单的来说:

  • 浅拷贝:简单的赋值拷贝操作,产生重复释放问题

  • 深拷贝:在堆区重新申请空间,进行拷贝操作,防止重复释放问题

 

class Person {
public:
    //无参(默认)构造函数
    Person() {
        cout << "无参构造函数!" << endl;
    }
    //有参构造函数
    Person(int age ,int height) {
        
        cout << "有参构造函数!" << endl;

        m_age = age;
        m_height = new int(height);
        
    }
    //拷贝构造函数  
    Person(const Person& p) {
        cout << "拷贝构造函数!" << endl;
        //如果不利用深拷贝在堆区创建新内存,会导致浅拷贝带来的重复释放堆区问题
        m_age = p.m_age;
        m_height = new int(*p.m_height);
        
    }

    //析构函数
    ~Person() {
        cout << "析构函数!" << endl;
        if (m_height != NULL)
        {
            delete m_height;
        }
    }
public:
    int m_age;
    int* m_height;
};

void test01()
{
    Person p1(18, 180);

    Person p2(p1);

    cout << "p1的年龄: " << p1.m_age << " 身高: " << *p1.m_height << endl;

    cout << "p2的年龄: " << p2.m_age << " 身高: " << *p2.m_height << endl;
}

int main() {

    test01();

    system("pause");

    return 0;
}

 

posted @ 2021-06-24 10:19  清水石头  阅读(193)  评论(0)    收藏  举报