C++深拷贝和浅拷贝

概念:

  在一个类中,如果定义有指针成员变量,该指针指向new出来的堆内存。在用一个已经存在的对象初始化一个新对象时调用拷贝构造函数,如果拷贝构造函数中只是将已有对象的指针成员赋值给新对象的指针成员,那么就叫浅拷贝,浅拷贝以后两个对象中的指针指针成员指向同一个堆内存,在对象析构时,同一块堆内存会释放两次,堆内存释放两次程序会发生core dump,马上崩溃。正确的做法应该是在拷贝构造函数中为新对象开辟一段新内存,将已有对象堆内存里面的数据拷贝到新开辟的内存,这叫做深拷贝,深拷贝以后两个对象中的指针成员指向不同的内存,自己负责释放自己的堆内存。

 

实验一:浅拷贝

不定义拷贝构造函数,类会自己生成默认拷贝构造函数,默认拷贝构造函数是浅拷贝

#include <iostream>

using namespace std;

class test {
public:
    test(int num) {
        test_ptr_ = new int(num);
    }

    ~test() {
        if (test_ptr_ != nullptr) {
            cout << "delete test" << endl;
            delete test_ptr_;
        }

        test_ptr_ = nullptr;
    }

private:
    int *test_ptr_;
};

int main()
{
    test t1(10);
    test t2(t1);

    return 0;
}

运行结果:

 

 

实验2:深拷贝

#include <iostream>

using namespace std;

class test {
public:
    test(int num) {
        test_ptr_ = new int(num);
    }

    test(const test &right) {
        test_ptr_ = new int(*right.test_ptr_);
    }

    ~test() {
        if (test_ptr_ != nullptr) {
            cout << "delete test" << endl;
            delete test_ptr_;
        }

        test_ptr_ = nullptr;
    }

private:
    int *test_ptr_;
};

int main()
{
    test t1(10);
    test t2(t1);

    return 0;
}

执行结果:

 

 

tips:如果类中有指针成员指向堆内存,一定要自己实现拷贝构造函数(深拷贝),不要用默认的拷贝构造函数。

 

posted @ 2021-04-26 23:38  我是团长  阅读(274)  评论(0编辑  收藏  举报