c++之深拷贝和浅拷贝

浅拷贝:简单的赋值拷贝操作。

深拷贝:在堆区重新申请空间,进行拷贝操作。

#include<iostream>
using namespace std;

class Person {
public:
    int m_age;
    int* m_height;
    Person() {
        cout << "Person默认构造函数" << endl;
    }
    Person(int age, height) {
        m_age = age;
        m_height = new (height);//浅拷贝
        cout << Person(int age)构造函数const Person& p) {
        m_age = p.m_age;
        m_height = int(*p.m_height);//这就是深拷贝操作
        cout << 拷贝构造函数 endl;
    }
    ~Person() {
        将堆区的数据进行释放
        浅拷贝带来的问题就是重复释放,可以利用深拷贝来解决
        if (m_height != NULL) {
            delete m_height;
            m_height = NULL;
        }
        cout << Person析构函数 endl;
    }

};
void test() {
    Person p1(18,178);
    cout << p1的年龄为:" << p1.m_age << 身高为:"<<*p1.m_height<<endl;
    Person p2(p1);
    cout << p2的年龄为:" << p2.m_age << " << *p2.m_height << endl;
}
 main() {
    test();
    system(pause");
    return 0;
}

输出:

 

为什么浅拷贝会带来重复释放问题呢?

在堆区开辟内存存储数据之后,如果不自己定义拷贝构造函数,那么系统会调用默认的拷贝构造函数,这种情况下就是浅拷贝,此时,p2和p1的m_height都指向同一块地址。当p2被释放之后,即指向的地址释放了,此时再去释放p1,p1就找不到其指向的内存,但是又要进行释放,所以就重复释放,运行时会报错。

相关文章

一.C语言中的static关键字 在C语言中,static可以用来修饰局...
浅谈C/C++中的指针和数组(二) 前面已经讨论了指针...
浅谈C/C++中的指针和数组(一)指针是C/C++...
从两个例子分析C语言的声明 在读《C专家编程》一书的第三章时...
C语言文件操作解析(一)在讨论C语言文件操作之前,先了解一下...
C语言文件操作解析(三) 在前面已经讨论了文件打开操作,下面...