浅拷贝的问题分析:
#include <iostream>
#include <string.h>
using namespace std;
class Name
{
public:
Name(const char *p)
{
m_len=strlen(p);
m_p=(char *)malloc(m_len+1);
}
~Name()
{
cout<<"析构函数被调用"<<endl;
if(m_p!=NULL)
{
free(m_p);
m_p=NULL;
m_len=0;
}
cout<<"析构函数执行结束"<<endl;
}
private:
char *m_p;
int m_len;
};
int main()
{
{
Name name1("xiaoming");
Name name2=name1;
}
return 0;
}
执行结果如下:
由上面的执行结果可知:浅拷贝即name2这个对象和name1用的是同一块内存,当name1执行完之后,将内存释放,所以name2执行时就没有内存用来释放,所以第二次执行析构函数~name时会出错。
浅拷贝问题解决:深拷贝
#include <iostream>
#include <string.h>
using namespace std;
class Name
{
public:
Name(const char *p)
{
m_len=strlen(p);
m_p=(char *)malloc(m_len+1);
}
Name(const Name &obj)
{
m_len=obj.m_len;
m_p=(char *)malloc(m_len+1);
strcpy(m_p,obj.m_p);
}
~Name()
{
cout<<"析构函数被调用"<<endl;
if(m_p!=NULL)
{
free(m_p);
m_p=NULL;
m_len=0;
}
cout<<"析构函数执行结束"<<endl;
}
private:
char *m_p;
int m_len;
};
int main()
{
{
Name name1("xiaoming");
Name name2=name1;
}
return 0;
}
执行结果如下:
从执行结果分析可得:解决浅拷贝的方案:手动编写拷贝构造函数,进行深拷贝。这样他们就分别拥有各自的内存。