目录
1.深拷贝和浅拷贝是什么
2.案例分析
完整代码
1.深拷贝和浅拷贝是什么

看不懂没关系,下面有案例分析
2.案例分析
浅拷贝可能会导致堆区的内存重复释放
 一个名为person的类里面有年龄和指向身高的指针这两个成员。
 一个名为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;
}


















