目录
1.深拷贝和浅拷贝是什么
2.案例分析
完整代码
1.深拷贝和浅拷贝是什么
看不懂没关系,下面有案例分析
2.案例分析
浅拷贝可能会导致堆区的内存重复释放
一个名为person的类里面有年龄和指向身高的指针这两个成员。
当我们执行到person p2(p1)的操作时,会复制一份p1给p2,如图。
当函数快要执行完毕,先执行p1的析构函数,p1的height指针会指向空,那个地址处存放的值,也就是堆区存放的那个值会被删除掉。
然后再执行p2的析构函数,p2的指针和p1的指针所存放的地址相同,会导致堆区又被删除一次,会导致错误。
解决办法,用深拷贝来解决:
让拷贝的那个指针存的地址不同,但值相同
完整代码
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
class person
{
public:
int age;
int *height;
person(){
cout << "无参构造函数调用" << '\n';
}
person(int a,int h){
age = a;
height = new int(h);
cout << "有参构造函数调用" << '\n';
}
//拷贝构造函数
person(const person &p){
age = p.age;
//height = p.height;编译器默认实现,这就是浅拷贝
//深拷贝操作
height = new int(*p.height);
cout << "拷贝构造函数调用" << '\n';
}
~person(){
//将堆区开辟的数据做释放操作
if(height != NULL){
delete height;
height = NULL;
}
cout << "析构函数调用" << endl;
}
};
void test(){
person p1(18,180);
person p2(p1);
}
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
test();
return 0;
}