浅拷贝
#include <iostream>
using namespace std;
class Person{
public:
int old;
int *Height;
Person(){
cout<<"默认无参"<<endl;
}
Person(int a, int height){
old = a;
Height = new int(height);//堆区分配一块空间
cout<<"有参构造"<<endl;
}
Person(const Person &p){
old = p.old;
Height = p.Height;
}
~Person(){
if(Height != NULL){
delete Height;
Height = NULL;
}
cout<<"析构函数"<<endl;
}
};
void test(){
int *height = new int();
Person p(12, 160);
Person p2(p);
cout<<"p2的身高是"<< *p2.Height<<endl;
cout<<"p的身高是"<< *p.Height<<endl;
}
int main() {
test();
return 0;
}
浅拷贝在析构函数中释放Height指向的内存时,拷贝了几个对象,就复制了几个相同的地址值,那么在这几个对象生命周期结束时,就会释放地址对应的内存,那么内存就被多次释放
深拷贝
#include <iostream>
using namespace std;
class Person{
public:
int old;
int *Height;
Person(){
cout<<"默认无参"<<endl;
}
Person(int a, int height){
old = a;
Height = new int(height);//堆区分配一块空间
cout<<"有参构造"<<endl;
}
Person(const Person &p){
old = p.old;
//Height = p.Height;
//改为深拷贝
Height = new int(*p.Height);//另开一个空间存height
}
~Person(){
if(Height != NULL){
delete Height;
Height = NULL;
}
cout<<"析构函数"<<endl;
}
};
void test(){
int *height = new int();
Person p(12, 160);
Person p2(p);
cout<<"p2的身高是"<< *p2.Height<<endl;
cout<<"p的身高是"<< *p.Height<<endl;
}
int main() {
test();
return 0;
}