stl string 写时拷贝

stl string 写时拷贝

对于stl中的string的写时拷贝还是最近才发现的,起因是应用类似于如下的代码:

1 string  str  =   " beifei ";
2 string  str1  =  str;
3 sprintf(( char * )str.c_str(), " xiao " );
4
打印str,str1发现两者的内容是一样的,翻阅资料才发现string采用的是写时拷贝,至于写操作是则是特定的操作,如赋值操作符,下标操作符等,像以上的代码属于hack一下,绕开了写时拷贝的接口,所以才会出现以上情况。

下面再举个例子,用以加深印象:

 1 #include  < iostream >
 2 #include  < string >
 3 using   namespace  std;
 4
 5 int  main()
 6 {
 7    string str1= "beifei";
 8    string str2 = str1;
 9
10    cout << (void*)str1.c_str() << endl;
11    cout << (void*)str2.c_str() << endl;
12
13    str1 = "xieyang";
14    cout << (void*)str1.c_str() << endl;
15    cout << (void*)str2.c_str() << endl;
16
17    return 0;
18}
以上代码的输出结果是:
0x502028
0x502028
0x502058
0x502028
我们可以看到,只要进行赋值之后,两个string对象内部指向的字符串地址才会发生变化,也只有这个时候才会发现写时拷贝。

你可能感兴趣的:(stl string 写时拷贝)