AndreaDO

导航

C++ 深拷贝浅拷贝

C++ 深拷贝浅拷贝

C++默认生成的拷贝构造函数,他的行为就是浅拷贝,他只会复制一个一模一样的的指针,并不会操作指针指向的东西。
要想实现我们的逻辑需求,就要自定义拷贝构造函数,实现深拷贝。

我们来具体说明一下上面的话
首先我们创建一个简单的类

#include <iostream>
using namespace std;
class Person{
  public:
  Person(int age1):age(age1),m_ptr(nullptr)
  {
    if(age1>0)
      m_ptr=(int*)malloc( age1 );
  }
  ~Person()
  {
    free(m_ptr);
    m_ptr=nullptr;
  }
  private:
  int * m_ptr;
  int age;
};

int main() 
{
Person p1(10);
Person p2 = p1;
return 0;
}

这个时候就会发现编译没有问题,但是一旦运行就会报错。
这个是因为系统的默认拷贝构造是浅拷贝,把p1成员指针的内容复制给p2成员指针,导致这两个指针都指向的同一个内存地址
然后p1先调用析构函数,内存释放,接下来p2也会调用析构函数,但是由于p1已经释放了内存地址,该地址为空又调用free函数就会引发异常
这个时候我们需要自己实现拷贝构造函数,写一个深拷贝:

//修改后的代码
#include <iostream>
using namespace std;

class Person{
  public:

  Person(int age1):age(age1),m_ptr(nullptr)
  {
    if(age1>0)
      m_ptr=(int*)malloc( age1 );
  }
  
  Person(const Person& p):age(p.age),m_ptr(nullptr)
  {
    if(p.age>0)
      m_ptr=(int*)malloc( p.age );
  }
  Person& operator=(const Person& p)
  {
    if(this == &p) //避免自我赋值
    {return *this;}
    free(m_ptr);
    age=p.age;
    m_ptr = (int*)malloc(p.age);
    return *this;
  }
  ~Person()
  {
    free(m_ptr);
    m_ptr=nullptr;
  }
  private:
  int * m_ptr;
  int age;
};

int main() 
{
Person p1(10);
Person p2 = p1;
return 0;
}

这个时候运行就不会产生异常,这就是深拷贝和浅拷贝

posted on 2024-02-19 18:31  AndreaDO  阅读(42)  评论(0)    收藏  举报