string类的深浅拷贝,写时拷贝
浅拷贝:多个指针指向同一块空间,多次析构同一块内存空间,系统会崩溃。(浅拷贝就是值拷贝)
深拷贝:给指针开辟新的空间,把内容拷贝进去,每个指针都指向自己的内存空间,析构时不会内存崩溃。
#include <iostream>
#include <string>
using namespace std;
class String
{
public:
String(const char*str)
:_str(new char [strlen(str)+1])
{
strcpy(_str,str);
}
//String(const String& str) //浅拷贝
// :_str(str._str)
// {}
//String &operator=(const String& str)
//{
// if(this!= &str)
// {
// _str = str._str;
// }
// return *this;
//}
String(const String& str) //深拷贝
:_str(new char[strlen(str._str)+1])
{
strcpy(_str,str._str);
}
String &operator=(const String& str)
{
if(this!=&str)
{
//delete[] _str;
//_str=new char [strlen(str._str)+1];
//strcpy(_str,str._str);
_str=str._str;
}
return *this;
}
~String()
{
if(_str)
{
cout<<"~String()"<<endl;
delete[] _str;
}
}
private:
char*_str;
};
void TestString()
{
String s1("hello world!");
String s2=s1;//s2(s1)
}
int main()
{
TestString();
return 0;
}
写时拷贝:会存在一个计数器,并且多个对象指向同一块空间,每次创建一个新的对象时计数器加++,销毁时计数器--,直到计数器count=0时析构。
class String
{
public:
String(const char*str)
:_str(new char [strlen(str)+1])
,_count(1)
{
strcpy(_str,str);
}
String(const String& str)
:_str(str._str)
{
_count++;
}
String &operator=(const String& str)
{
if(this!= &str)
{
_str = str._str;
}
return *this;
}
~String()
{
if(--_count == 0)
{
cout<<"~String()"<<endl;
delete[] _str;
}
}
private:
char*_str;
int _count;
};
void Test()
{
String s1("hello world!");
String s2=s1;
String s3 = s2;
}
int main()
{
Test();
return 0;
}
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。