深拷贝与浅拷贝

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

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

     class Person{
     public:
      	int age;
      	int *height;
      	
        Person(int p_age,int p_height){
          	age=p_age;
          	height=new int(p_height);//在堆区申请空间
        }
        
      	Person(const Person& p){//浅拷贝
          	age=p.age;
          	height=p.height;//此处拷贝的也是同一个堆空间的地址
        }
        
        ~Person(){
          	if(height!=NULL){
              	delete height;//申请的堆空间需要用户自己释放
              }
         }
      }
      
      void test(){
      	Person p1(10,100);
          Person p2(p1);
      }
    

以上代码会报错:重复释放空间

p2会先调用析构函数,释放height指向的空间,然后p1也会调用析构函数释放height指向的地址(同p1) alt

解决方式:

    Person(const Person& p){//深拷贝
        	age=p.age;
        	height=new int(*p.height);//重新申请一个空间存放height的值
      }

alt

如果属性有在堆区开辟空间的,一定要自己提供拷贝构造函数,防止浅拷贝带来的问题