同一类型的对象之间可以赋值,使得两个对象的成员变量的值相同,两个对象仍然是独立的两个对象,这种情况被称为浅拷贝.
一般情况下,浅拷贝没有任何副作用,但是当类中有指针,并且指针指向动态分配的内存空间,析构函数做了动态内存释放的处理,会导致内存问题。
当类中有指针,并且此指针有动态分配空间,析构函数做了释放处理,往往需要自定义拷贝构造函数,自行给指针动态分配空间,深拷贝。
浅拷贝只是对指针的拷贝,拷贝后两个指针指向同一个内存空间,深拷贝不但对指针进行拷贝,而且对指针指向的内容进行拷贝,经深拷贝后的指针是指向两个不同地址的指针。
#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;
}
浅拷贝,系统默认提供的拷贝构造;
如果属性里有指向堆区空间的数据,那么简单的浅拷贝会导致重复释放内存的异常;
解决以上问题,需要我们自己提供拷贝构造函数,进行深拷贝。