您的位置:首页 > 其它

String深拷贝

2016-04-16 14:20 337 查看
当类里面有指针对象时,进行简单赋值的浅拷贝,两个对象指向同一块内存,存在崩溃的问题!这里我们要进行深拷贝。

简单的赋值浅拷贝

String S1("hello world");

String s2=s1;

s1和s2中包含的指针对象同时指向一块内存hello world,析构时delete调用两次这块内存析构两次,崩溃。因此要深拷贝

深拷贝

构造s2 时拷贝一块跟s1指向的数据块一样大小的空间,并将值拷贝下来,这样s1和s1指向各自的数据块,析构时释放各自的数据块。

#include<iostream>
using namespace std;

class String
{
public:
char* GetStr()
{
return _ptr;
}
String(char* str = NULL)
{
if (str == NULL)
{
_ptr = new char[1];
_ptr[0] = '\0';
return;
}
_ptr = new char[strlen(str) + 1];
strcpy(_ptr, str);
}
void Swap(String& s)
{
char* tmp = s._ptr;
s._ptr = _ptr;
_ptr = tmp;
}
String(const String& s)
:_ptr(NULL)
{
String tmp(s._ptr);
Swap(tmp);
}
String& operator=(String& s)
{
if (this != &s)
{
String tmp(s._ptr);
Swap(tmp);
}
return *this;
}
/*String (const String& s)
:_ptr(new char[strlen(s._ptr)+1])
{
strcpy(_ptr,s._ptr);
}
String& operator=(const String& s)
{
if(this!=&s)
{
delete [] _ptr;
_ptr=new char[strlen(s._ptr)+1];
strcpy(_ptr,s._ptr);
}
return *this;
}*/
~String()
{
delete[] _ptr;
}
private:
char* _ptr;
};

int main()
{
String s1;
cout << "s1" << s1.GetStr() << endl;

String s2("qwer");
cout << "s2:" << s2.GetStr() << endl;

String s3(s2);
cout << "s3:" << s3.GetStr() << endl;

s1 = s3;
cout << "s1:" << s1.GetStr() << endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: