浅拷贝问题分析
默认复制构造函数可以完成对象的数据成员值简单的复制
对象的数据资源是由指针指示的堆时,默认复制构造函数仅作指针值复制
解决方法:
深拷贝
#include <iostream>
#include <stdlib.h>
using namespace std;
class Teacher
{
public:
Teacher(int a, char *name)
{
m_age = a;
m_name = (char *)malloc(sizeof(char)*20);
strcpy(m_name, name);
}
// 深拷贝
Teacher(const Teacher &obj)
{
m_age = obj.m_age;
// 为当前对象的指针变量 在堆上开辟空间
m_name = (char *)malloc(sizeof(char)*20);
// 复制数据
strcpy(m_name, obj.m_name);
}
~Teacher()
{
if(m_name != NULL)
free(m_name);
m_name = NULL;
}
void print()
{
printf ("age = %d, name = %s\n", m_age, m_name);
}
private:
int m_age;
char *m_name;
};
int main2_1()
{
Teacher t(10, "小明");
t.print();
// 默认拷贝构造函数: "值"的拷贝, 不会复制堆上的空间 ====> 浅拷贝
// 修改: 自己编写拷贝构造函数, 实现堆上空间的复制, ====> 深拷贝
Teacher t1 = t;
t1.print();
return 0;
}
执行结果:
age = 10,name = 小明
age = 10,name = 小明
如果不写深拷贝函数,则系统会调用默认拷贝函数,但只会进行简单的复制“值”的操作,从而会导致系统在调用两次析构函数的时候会,释放两次m_name的空间,使得程序不能运行