string类的深浅拷贝,写时拷贝
string类的深浅拷贝,写时拷贝
浅拷贝:多个指针指向同一块空间,多次析构同一块内存空间,系统会崩溃。(浅拷贝就是值拷贝)
深拷贝:给指针开辟新的空间,把内容拷贝进去,每个指针都指向自己的内存空间,析构时不会内存崩溃。
#include<iostream>#include<string>usingnamespacestd;classString{public:String(constchar*str):_str(newchar[strlen(str)+1]){strcpy(_str,str);}//String(constString&str)//浅拷贝//:_str(str._str)//{}//String&operator=(constString&str)//{//if(this!=&str)//{//_str=str._str;//}//return*this;//}String(constString&str)//深拷贝:_str(newchar[strlen(str._str)+1]){strcpy(_str,str._str);}String&operator=(constString&str){if(this!=&str){//delete[]_str;//_str=newchar[strlen(str._str)+1];//strcpy(_str,str._str);_str=str._str;}return*this;}~String(){if(_str){cout<<"~String()"<<endl;delete[]_str;}}private:char*_str;};voidTestString(){Strings1("helloworld!");Strings2=s1;//s2(s1)}intmain(){TestString();return0;}
写时拷贝:会存在一个计数器,并且多个对象指向同一块空间,每次创建一个新的对象时计数器加++,销毁时计数器--,直到计数器count=0时析构。
classString{public:String(constchar*str):_str(newchar[strlen(str)+1]),_count(1){strcpy(_str,str);}String(constString&str):_str(str._str){_count++;}String&operator=(constString&str){if(this!=&str){_str=str._str;}return*this;}~String(){if(--_count==0){cout<<"~String()"<<endl;delete[]_str;}}private:char*_str;int_count;};voidTest(){Strings1("helloworld!");Strings2=s1;Strings3=s2;}intmain(){Test();return0;}
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。