浅拷贝: 简单的赋值拷贝操作。
深拷贝: 在堆区重新申请空间,进行拷贝操作。
如果有属性是开辟到堆区,一定要自己提供拷贝构造函数,
防止浅拷贝带来的问题
#include <iostream>
using namespace std;
//深拷贝与浅拷贝
class Person{
public:
Person()
{
cout << "Person 默认构造函数的调用" << endl;
}
Person(int age,int height)
{
m_Age = age;
m_Height = new int(height);
cout << "Person 有参构造函数的调用" << endl;
}
Person(const Person &p)
{
m_Age = p.m_Age;
//m_Height = p.m_Height; //这句话就是浅拷贝,就是一个简单赋值的操作。
//系统给你提供的拷贝构造函数,其实就是做了浅拷贝。
m_Height = new int(*p.m_Height); //这句话就是深拷贝,重新在堆区申请空间。
cout << "Person 拷贝构造函数的调用" << endl;
}
~Person()
{
if(m_Height != NULL)
{
delete m_Height;
m_Height = NULL; //delete后还能调用
}
cout << "Person 析构函数的调用" << endl;
}
int m_Age; //年龄
int *m_Height; //身高
};
int main(int argc,char *argv[])
{
//实例化对象
Person p1(18,165);
cout << "p1的年龄:" << p1.m_Age << " p1的身高:" << *p1.m_Height << endl;
Person p2(p1);
cout << "p2的年龄:" << p2.m_Age << " p2的身高:" << *p2.m_Height << endl;
return 0;
}
/*
使用浅拷贝结果:
gec@ubuntu:/mnt/hgfs/love_you/02$ g++ demo1.cpp
gec@ubuntu:/mnt/hgfs/love_you/02$ ./a.out
Person 有参构造函数的调用
p1的年龄:18 p1的身高:165
Person 拷贝构造函数的调用
p2的年龄:18 p2的身高:165
Person 析构函数的调用
free(): double free detected in tcache 2//在tcache 2中检测到双空闲,
//在执行程序的过程中对同一块内存单元进行了两次free()操作。
已放弃 (核心已转储)
gec@ubuntu:/mnt/hgfs/love_you/02$
*/
/*
浅拷贝拷贝的是地址,两个对象指向同一堆空间,调用析构时第二个对象释放不属于自己的空间(已经被第一个对象释放)
*/