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

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

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

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

      

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

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;
}

 浅拷贝是简单的值拷贝,系统默认提供的拷贝构造;

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

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