深拷贝和浅拷贝的实质在于防止悬挂指针
当类中的数据成员含有指针或者引用时,如果简单的定义拷贝复制函数,那即是指针的复制拷贝,这样的话两个对象中的指针成员会指向一段相同的内存。如果使用其中的一个释放掉堆中的内存,再使用另一个释放的时候,程序会报错,甚至奔溃。
#include<iostream>
using namespace std;
#include<string.h>
class stest
{
char *s;
public:
stest(char *p=0)
{
if(p==0)
s=0;
else
{
s=new char[strlen(p)+1];
strcpy(s,p);
cout<<strlen(p)<<endl;;
}
cout<<"调用了构造函数"<<endl;
}
~stest()
{
if(s)
delete []s;
cout<<"调用了析构函数"<<'\n';
}
void display()
{
cout<<s<<endl;
}
stest(stest &);
};
stest::stest(stest &a)
{
s=a.s;
cout<<"调用了拷贝构造函数"<<endl;
}
void main()
{
char a[20]="avsdfes";
stest string1(a);
string1.display();
// stest string2(string1); A
}
}
这段代码中,简单定义了类stest中有一个char *s;若无A行,程序正常,如下图右上角显示。若使用拷贝构造函数,可以看到,是第二次调用析构函数时发生的奔溃。
另外,strlen()函数求字符串长度时不包含空字符’\0’;