C++基础知识(深拷贝与浅拷贝)

       同一类型的对象之间可以赋值,使得两个对象的成员变量的值相同,两个对象仍然是独立的两个对象,这种情况被称为浅拷贝.

       一般情况下,浅拷贝没有任何副作用,但是当类中有指针,并且指针指向动态分配的内存空间,析构函数做了动态内存释放的处理,会导致内存问题。

      

       当类中有指针,并且此指针有动态分配空间,析构函数做了释放处理,往往需要自定义拷贝构造函数,自行给指针动态分配空间,深拷贝。 

         浅拷贝只是对指针的拷贝,拷贝后两个指针指向同一个内存空间,深拷贝不但对指针进行拷贝,而且对指针指向的内容进行拷贝,经深拷贝后的指针是指向两个不同地址的指针

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;

class Person
{
public:

	Person()
	{

	}

	//初始化属性
	Person(char * name, int age)
	{
		m_Name = (char*)malloc(strlen(name) + 1);
		strcpy(m_Name, name);
		m_Age = age;
	}

	//拷贝构造  系统会提供默认拷贝构造,而且是简单的值拷贝
	//自己提供拷贝构造,原因是简单的浅拷贝会释放堆区空间两次,导致挂掉
	Person(const Person& p)
	{
		m_Age = p.m_Age;
		m_Name = (char*)malloc(strlen(p.m_Name) + 1); //重新申请一个堆区空间
		strcpy(m_Name, p.m_Name);
	}

	//析构函数调用
	~Person()
	{
		cout << "析构函数调用" << endl;
		if (m_Name != NULL)
		{
			free(m_Name);
			m_Name = NULL;
		}
	}

	//姓名
	char * m_Name;
	//年龄
	int m_Age;
};

void test01()
{
	Person p1("aa", 10);
	Person p2(p1);  //调用拷贝构造
}

int main(void)
{
	test01();
	system("pause");
	return 0;
}

 浅拷贝,系统默认提供的拷贝构造;

如果属性里有指向堆区空间的数据,那么简单的浅拷贝会导致重复释放内存的异常;

解决以上问题,需要我们自己提供拷贝构造函数,进行深拷贝。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值