这是错误的,具体修改就用到了赋值运算符重载
#include <iostream>
using namespace std;
class Person
{
public:
int* m_Age; // 这里用到了指针,这样开辟的成员变量就在堆中。
// 由于变量是在堆中,所以要程序员自己释放掉,new用delete;
// malloc用free
Person(int age)
{
m_Age = new int(age);
}
~Person()
{
if (m_Age != NULL)
{
delete m_Age;
m_Age = NULL;
}
}
};
void test()
{
Person p1(18);
Person p2(20);
p2 = p1; // 系统自带的赋值运算是浅拷贝,它把原来的指针也拷贝给了p2,
//相当于是p1和p2都指向了同一个堆里面的数据。当触发析构时,删除了堆里面的数据。
cout << *p2.m_Age << endl; // *是解指针,&是获取变量的指针
cout << *p1.m_Age << endl;
}
int main()
{
test();
return 0;
}
下面就解决了上面的问题,用到了赋值符重载,把浅拷贝变成了深拷贝
#include <iostream>
using namespace std;
class Person
{
public:
int* m_Age; // 这里用到了指针,这样开辟的成员变量就在堆中。
// 由于变量是在堆中,所以要程序员自己释放掉,new用delete;
// malloc用free
Person(int age)
{
m_Age = new int(age);
}
~Person()
{
if (m_Age != NULL)
{
delete m_Age;
m_Age = NULL;
}
}
Person& operator=(Person &p) // 这里返回的仍然是Person类,因为a=b=c在c++中是可以存在的。
{
// 先判断自身有没有变量在堆区,如果有,先释放干净
if (m_Age != NULL)
{
delete m_Age;
m_Age = NULL;
}
m_Age = new int(*p.m_Age);
return *this;
}
};
void test()
{
Person p1(18);
Person p2(20);
p2 = p1; // 系统自带的赋值运算是浅拷贝,它把原来的指针也拷贝给了p2,
//相当于是p1和p2都指向了同一个堆里面的数据。当触发析构时,删除了堆里面的数据。
cout << *p2.m_Age << endl; // *是解指针,&是获取变量的指针
cout << *p1.m_Age << endl;
}
int main()
{
test();
return 0;
}