c++深拷贝与浅拷贝

浅拷贝,编译器提供的简单的复制拷贝操作

深拷贝,在堆区重新申请空间,进行拷贝

当有指针和堆区存在时浅拷贝可能会造成重复释放问题,这种时候要自己定义深拷贝函数防止出现错误

、/拷贝构造函数
Person(const Person& p) {
//如果不利用深拷贝在堆区创建新内存,会导致浅拷贝带来的重复释放堆区问题
m_age = p.m_age;
m_height = new int(*p.m_height);
}
也就是说,如果属性有在堆区开辟的,那么一定自己提供拷贝构造函数,防止浅拷贝带来问题
 

浅拷贝

  • 对于基本数据类型的成员变量,浅拷贝直接进行值传递,也就是将属性值复制了一份给新的成员变量
  • 对于引用数据类型的成员变量,比如成员变量是数组、某个类的对象等,浅拷贝就是引用的传递,也就是将成员变量的引用(内存地址)复制了一份给新的成员变量,他们指向的是同一个事例。在一个对象修改成员变量的值,会影响到另一个对象中成员变量的值。

深拷贝

  • 对于基本数据类型,深拷贝复制所有基本数据类型的成员变量的值
  • 对于引用数据类型的成员变量,深拷贝申请新的存储空间,并复制该引用对象所引用的对象,也就是将整个对象复制下来。所以在一个对象修改成员变量的值,不会影响到另一个对象成员变量的值。

从本质上来说,浅拷贝是将变量代表的地址中的值直接拷贝到新的数据中,但是如果存在指针变量等值为地址的变量,浅拷贝会导致地址传递的引用拷贝,而不是实际指向的值的拷贝,所以会出现变量代表的地址中的地址值被重复释放的问题。

同时注意指针变量等代表地址的变量在所保存的地址被释放,不在代表具体含义的时候,要将指针指向NULL,防止出现野指针

posted @   纸包鱼  阅读(57)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示