您的位置:首页 > 编程语言 > C语言/C++

C++学习记录15--类中的深拷贝和浅拷贝

2017-09-28 17:28 162 查看
深拷贝和浅拷贝的实质在于防止悬挂指针

当类中的数据成员含有指针或者引用时,如果简单的定义拷贝复制函数,那即是指针的复制拷贝,这样的话两个对象中的指针成员会指向一段相同的内存。如果使用其中的一个释放掉堆中的内存,再使用另一个释放的时候,程序会报错,甚至奔溃。

#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’;

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: