栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

深拷贝和浅拷贝

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

深拷贝和浅拷贝

文章目录
  • 默认拷贝构造
  • 问题
  • 解决方案
  • 拷贝构造调用时机

默认拷贝构造

C++编译器默认是逐字节拷贝(对非静态成员进行值拷贝)

问题

当类的内部包含了指针,指针指向动态内存空间,逐字节拷贝就会出现两个对象指向同一块内存空间的情况,释放内存时,出现重复释放的问题,导致程序奔溃

示例:

class Person
{
public:
	Person(char* name,int age)
	{
		mAge = age;
		pName = new char[strlen(name)+1];
		strcpy(pName,name);
	}

~Person()
{
	if(pName != nullptr)
	{
		delete[] pName;
		pName =	nullptr; 
	}
}
public:
	int mAge;
	char *pName;

}

void test()
{
	Person p1("wuyou",18);
	Person p2(p1);
}

解决方案
  • 在类内部添加自己的拷贝构造
  • 如果自定义了普通构造函数,编译器不在提供默认构造函数,但是会提供拷贝构造函数
  • 类内添加了自定义拷贝后,将不再提供默认构造
Person(const Person &p)
{
	mAge = p.mAge;
	pName = new char[strlen(p.pName) + 1];
	strcpy(pName,p.pName)
}
拷贝构造调用时机
  • 对象以值传递的方式传给函数参数
  • 对象以值传递的方式从函数返回
  • 用一个对象初始化另一个对象
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/886838.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号