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;}