C++解决浅拷贝问题
1.什么是浅拷贝?
首先我们看以下代码
```c++
#include <iostream>
using namespace std;
class Person
{
public:
Person(int age) //有参构造
{
m_Age = age;
}
~Person() //析构函数
{
if(m_Age != NULL) //释放m_Age指向的内存空间
{
delete m_Age;
m_Age = NULL;
}
}
int * m_Age;
};
void test()
{
Person p1(18); //利用有参构造创建对象p1
Person p2(p1); //利用编译器提供的拷贝构造创建对象p2
}
int main()
{
test();
return 0;
}
上述代码会出先浅拷贝问题,因为用的是编译器默认提供的拷贝构造函数创建的p2,因此p1和p2指向的内存空间是相同的,当test调用结束后编译器会调用我们自己提供的析构函数来释放内存空间,此时就会出现同一内存空间的重复释放问题,这会导致程序的崩溃
## 2.解决方法
### 方法1:自己提供一个拷贝构造函数
```c++
class Person
{
public:
Person(int age)
{
m_Age = age;
}
Person(const Person & p)//自己提供的拷贝构造函数
{
m_Age = new int(*p.m_Age); //深拷贝,重新开辟一份全新的内存空间
}
~Person() //析构函数
{
if(m_Age != NULL) //释放m_Age指向的内存空间
{
delete m_Age;
m_Age = NULL;
}
}
int * m_Age;
};
方法2:重载赋值运算符
```c++
class Person
{
public:
Person(int age)
{
m_Age = age;
}
Person & operator=(Person & p)//重写赋值运算符
{
if(m_Age != NULL) //先判断是否有属性在堆区,如果有先释放干净,然后再深拷贝
{
delete m_Age;
m_Age = NULL;
}
m_Age = new int(*p.m_Age); c //深拷贝,重新开辟空间
return *this;
}
~Person() //析构函数
{
if(m_Age != NULL) //释放m_Age指向的内存空间
{
delete m_Age;
m_Age = NULL;
}
}
int * m_Age;
};