0
点赞
收藏
分享

微信扫一扫

C++深拷贝与浅拷贝

东方小不点 2022-03-12 阅读 58
c++
class Person {
public:
    Person(){}
    Person(int age, int height) {
        _age = age;
        _height = new int(height);    
    }
    ~Person() {
        if (_height) {
            delete _height;
            _height = NULL;
        }
    }
    int _age;
    int* _height;
};
使用时:如使用编译器提供的拷贝构造函数:
    Person p1(19,180);
    Person p2(p1);
    运行会导致程序崩溃,原因是,编译器提供的拷贝构造函数在将p1的值传递给p2时,
   ( 类里面指向在堆区开辟的内存的指针:int* _height)只是将地址赋给了p2,所以p2和p1内的_height指向同一块堆区内存。 在调用析构函数时,p2中_height指向的内存被释放了,而后面p1_height指向的内存又会被释放一次,所以导致程序崩溃。这就是编译器提供的拷贝构造函数是浅拷贝,堆区的内存重复释放。
   
解决:
    //自己实现浅拷贝构造函数,不使用编译器提供的拷贝构造函数
    Person(Person& p) {
        _age = p._age;
        _height = new int(*p._height); //深拷贝
    }
举报

相关推荐

0 条评论