c++浅拷贝和深拷贝问题

C++的深浅复制问题

当使用浅复制的时候

#include <iostream>
#include <string>
using namespace std;

class Person{
    public:
        Person(){
            cout <<"class 's defualt contructor call"<<endl;
        }
        Person(int age,int height){
            m_age =   age;
             m_height = new int(height);
            cout <<"class 's  contructor call with arguments"<<endl;
        }
        ~Person(){
            //cout <<"class 's destructor call"<<endl;
            if(m_height != NULL){
                delete m_height;
                m_height = NULL;//如果利用编译器提供的拷贝构造函数,会做浅拷贝操作
            }
        }
        int m_age;
        int *m_height;
};


int main(){
        Person p1(18,180);
        cout << "p1的年龄是:"<<p1.m_age<<endl<<" p1的身高是:"<<*p1.m_height<<endl;
        Person p2(p1);
        cout << "p2的年龄是:"<<p2.m_age<<endl<<" p2的身高是:"<<*p2.m_height<<endl;
    return 0;
}

出现的问题

问题出现的原因

if(m_height != NULL){
                delete m_height;
                m_height = NULL;
                }

根据先入后出原则,p2会首先把栈区中的内存空间给释放,当检测p1的时候m_height中的值也非空,这就导致再次释放栈区内存(双重释放),程序运行错误;

问题解决:使用深拷贝,手写一个拷贝构造函数

原理图:

实现方法:

#include <iostream>
#include <string>
using namespace std;

class Person{
    public:
        Person(){
            cout <<"class 's defualt contructor call"<<endl;
        }
        Person(int age,int height){
            m_age =   age;
             m_height = new int(height);
            cout <<"class 's  contructor call with arguments"<<endl;
        }
        ~Person(){
            //cout <<"class 's destructor call"<<endl;
            if(m_height != NULL){
                delete m_height;
                m_height = NULL;//如果利用编译器提供的拷贝构造函数,会做浅拷贝操作
            }
        }
        Person(const Person&p){
            cout << "Person's copy constructor call "<<endl;
            m_age = p.m_age;
            //m_height = p.m_height; 编译器会默认实现的就是这行代码
            m_height= new int(*p.m_height);
        }

        int m_age;
        int *m_height;
};


int main(){
        Person p1(18,180);
        cout << "p1的年龄是:"<<p1.m_age<<endl<<" p1的身高是:"<<*p1.m_height<<endl;
        Person p2(p1);
        cout << "p2的年龄是:"<<p2.m_age<<endl<<" p2的身高是:"<<*p2.m_height<<endl;
    return 0;
}
posted @ 2022-08-09 11:37  jerry-autumn  阅读(23)  评论(0)    收藏  举报