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;
}
这个时候运行就不会产生异常,这就是深拷贝和浅拷贝
标签:int,age,C++,Person,age1,拷贝,ptr From: https://www.cnblogs.com/AndreaDO/p/18021519