c++深拷贝与浅拷贝
浅拷贝,编译器提供的简单的复制拷贝操作
深拷贝,在堆区重新申请空间,进行拷贝
当有指针和堆区存在时浅拷贝可能会造成重复释放问题,这种时候要自己定义深拷贝函数防止出现错误
、/拷贝构造函数
Person(const Person& p) {
Person(const Person& p) {
//如果不利用深拷贝在堆区创建新内存,会导致浅拷贝带来的重复释放堆区问题
m_age = p.m_age;
m_height = new int(*p.m_height);
}
m_age = p.m_age;
m_height = new int(*p.m_height);
}
也就是说,如果属性有在堆区开辟的,那么一定自己提供拷贝构造函数,防止浅拷贝带来问题
浅拷贝
- 对于基本数据类型的成员变量,浅拷贝直接进行值传递,也就是将属性值复制了一份给新的成员变量
- 对于引用数据类型的成员变量,比如成员变量是数组、某个类的对象等,浅拷贝就是引用的传递,也就是将成员变量的引用(内存地址)复制了一份给新的成员变量,他们指向的是同一个事例。在一个对象修改成员变量的值,会影响到另一个对象中成员变量的值。
深拷贝
- 对于基本数据类型,深拷贝复制所有基本数据类型的成员变量的值
- 对于引用数据类型的成员变量,深拷贝申请新的存储空间,并复制该引用对象所引用的对象,也就是将整个对象复制下来。所以在一个对象修改成员变量的值,不会影响到另一个对象成员变量的值。
从本质上来说,浅拷贝是将变量代表的地址中的值直接拷贝到新的数据中,但是如果存在指针变量等值为地址的变量,浅拷贝会导致地址传递的引用拷贝,而不是实际指向的值的拷贝,所以会出现变量代表的地址中的地址值被重复释放的问题。
同时注意指针变量等代表地址的变量在所保存的地址被释放,不在代表具体含义的时候,要将指针指向NULL,防止出现野指针

浙公网安备 33010602011771号