深拷贝与浅拷贝
-
浅拷贝:简单的赋值拷贝操作
-
深拷贝:在堆区重新申请空间,进行拷贝操作
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)
解决方式:
Person(const Person& p){//深拷贝
age=p.age;
height=new int(*p.height);//重新申请一个空间存放height的值
}
如果属性有在堆区开辟空间的,一定要自己提供拷贝构造函数,防止浅拷贝带来的问题