C++深拷贝和浅拷贝
浅拷贝只是增加了一个指针指向已存在的内存地址;深拷贝是增加了一个指针并且申请了一个新的内存,使这个增加的指针指向这个新的内存。
使用深拷贝的情况下,释放内存的时候不会因为出现浅拷贝时释放同一个内存的错误。
点击查看代码
#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()
{
//释放堆区数据
if (m_Height != NULL)
{
delete m_Height;
m_Height = NULL;
}
cout << "Person的析构函数" << endl;
}
Person(const Person &p)
{
cout << "拷贝构造函数" << endl;
m_Age = p.m_Age;
// m_Height = p.m_Height;浅拷贝就是编译器提供的赋值操作
m_Height = new int(*p.m_Height);
//深拷贝操作:重新在堆区创建一个内存空间
}
int m_Age;
int* m_Height;
};
void test01()
{
Person p1(18,191);
cout << p1.m_Age <<" "<<*p1.m_Height<< endl;
Person p2(p1);
cout << p2.m_Age <<" "<<*p2.m_Height<< endl;
//浅拷贝会出错
//使用深拷贝来解决
}
int main()
{
test01();
return 0;
}
【推荐】国内首个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搭建本