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