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,防止出现野指针
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本