笔记四十九中谈到,两个对象分别有指针指向同一块内存空间,其中一个析构就会造成另外一个析构时因为二次析构同一块内存而出错。
那解决办法就是让着两个对象的两个指针指向两块不同的内存空间,两个对象,个人使用个人自己的内存空间,也就是深拷贝。也就是我们不用C++编译器给我们提供的默认拷贝构造函数,而是我们自己写拷贝构造函数,这也就是之前说过的:必要的时候,必须手工编写拷贝构造函数。
#define_CRT_SECURE_NO_WARNINGS
#include
usingnamespacestd;
className
{
public:
//构造函数
Name(constchar*myp)
{
m_len=strlen(myp);//字符串的长度,不含'0'
m_p=(char*)malloc(m_len+1);//申请内存
strcpy (m_p,myp);//字符串放到类中
}
//必要的拷贝构造函数
//解决办法:手工编写拷贝构造函数,使用深拷贝
Name(constName &obj)
{
len=obj.m_len;
m_p=(char*)malloc(len+1);
strcpy(m_p,obj.m_p);
}
//析构函数
~Name()
{
if(m_p!=NULL)
{
free(m_p);
m_p=NULL;
m_len=0;
}
}
protected:
private:
char*m_p;
intm_len;
};
voidobjplay()
{
Name obj1("abcdefg");
Name obj2=obj1;//调用obj2的默认拷贝构造函数
//没写拷贝构造函数,使用C++编译器默认的拷贝构造函数
//C++编译器提供的拷贝构造函数是一个浅拷贝
//就是指针变量赋值了,但是指针变量所指向的内存空间没有被拷贝过去
}
intmain()
{
objplay();
system("pause");
return0;
}
在程序中,我们手工编写了拷贝构造函数,在定义对象obj2时,这个对象的p和len属性都能得到属于自己的那份内存,因此就不存在二次析构的问题,也就可以运行通过。
领取专属 10元无门槛券
私享最新 技术干货