一、概念
二、浅拷贝问题解析
三、深拷贝解决浅拷贝问题
四、用代码分析:
1.浅拷贝代码出现问题
在下面代码里面定义了一个studen类,类里面有
默认构造函数、
参数构造函数--->给指针m_name申请内存空间
析构函数---->释放内存空间
其实里面还有拷贝构造函数,这是默认就有的,也就是浅拷贝函数----.>复制
还有个指针变量m_name
class student
{
public:
student()
{
cout <<"student() 默认构造函数"<<endl;
}
student(char * name)
{
m_name=(char *)malloc(strlen(name)+1);
if(m_name == nullptr)
{
cout<<"申请空间失败";
}
strcpy(m_name,name);
cout<<"有参数构造"<<endl;;
cout<<&m_name<<endl;
}
~student()
{
if(m_name != nullptr)
{
free(m_name);
m_name= nullptr;
}
cout<<"析构函数"<<endl;;
}
int a=20;
private:
char * m_name;
};
int main()
{
student A("hello");
student B = A;
return 0;
}
主函数分析:首先给对象A初始化,那么就会执行类中的有参数构造函数 student(char * name)
进行对指针变量申请内存空间
接着把A对象拷贝到B,这个时候B是不会去执行 student(char * name)这个构造函数,而是执行默认的拷贝函数,那么就不会去重新对指针申请内存空间,也就是说,A对象的m_name和B对象的m_name指向同一个内存,那么当A结束时就会调用析构函数,释放内存m_anme,当B也结束时也想调用析构函数去释放m_name指向的内存,可是已经被A释放了,那么就会出现如下错误:即内存释放2次
2.深拷贝解决问题
思路:我们只需在类中重新定义个拷贝构造函数,让这个构造函数去申请m_name的内存,然后把A中的内容拷贝到新申请的内存即可解决当A/B对象结束时释放自己的m_name指向内存
class student
{
public:
student()
{
cout <<"student() 默认构造函数"<<endl;
}
student(char * name)
{
m_name=(char *)malloc(strlen(name)+1);
if(m_name == nullptr)
{
cout<<"申请空间失败";
}
strcpy(m_name,name);
cout<<"有参数构造"<<endl;;
cout<<&m_name<<endl;
}
student(const student & kb)
{
m_name=(char *)malloc(strlen(kb.m_name)+1);
if(m_name == nullptr)
{
cout<<"申请空间失败";
}
strcpy(m_name,kb.m_name);
cout<<"拷贝构造"<<endl;
cout<<&m_name<<endl;
}
~student()
{
if(m_name != nullptr)
{
free(m_name);
m_name= nullptr;
}
cout<<"析构函数"<<endl;;
}
int a=20;
private:
char * m_name;
};
int main()
{
student A("hello");
student B = A;