0
点赞
收藏
分享

微信扫一扫

c++利用深拷贝来解决浅拷贝问题

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;    

};

举报

相关推荐

0 条评论