案例
class Person
{
public:
Person(int value) { p = new int(value); }
~Person() { delete p; p = nullptr; }
int* p;
};
int main()
{
Person p(10);
Person p2 = p; // 报错
system("pause");
}
析构时会出现报错
原因
默认拷贝构造函数仅仅创造一个指向相同地址的指针 ,这就导致了这两个对象析构的时候前一个Person对象会释放掉申请的内存,但第二个对象已经指向了不存在的内容 ,成为了野指针
解决
浅拷贝就像我造了一个房子 ,有了这个房子的钥匙和地址,别人想和我造一个一样的房子 ,可是建筑工人仅仅给那个人配了一把一样的钥匙 ,所以就变成了两把钥匙开相同房子的门 , 共用一个地址
解决方法当然是新造一个和我一样的房子 , 用新的地址 ,新的钥匙开新房子的门
class Person
{
public:
Person(int value) { p = new int(value); }
Person(const Person& value) { //手动申请新的内存
p = new int(*value.p);
}
~Person() { delete p; p = nullptr; }
int* p;
};
int main()
{
Person p(10);
Person p2 = p;
cout << *p2.p << endl;
system("pause");
}