STL类std::string的Copy-On-Write技术小述和一个常犯的错误

写时拷贝(Copy-On-Write)技术,常用于对象的复制中,比如STL类std::string就用了这个常见的技术。简单描述一下就是:当调用string的拷贝构造函数或者=operator时,string复制对象并不急于的从堆上开辟新的内存来保存来源string对象的值,而是简单的引用来源string对象的地址,完成了一次轻量级的拷贝。如果接下来你通过来源string的修改接口函数对源string的内容进行了修改,那么这个时候实质上的copy才会发生,string复制对象才会通过从堆上开辟新的内存来完成copy。其中保证string的COW正确性是通过引用计数来实现的(先不说它了)。

正因为如此,继续说一下一个常犯的错误:

通常写C++程序的同学,也会用大量的C函数,尤其是字符串的操作函数,这个时候的常用场景如下:

#include using namespace std; void test(const string str) { char* tmp = (char *)str.c_str(); tmp[1]='t'; } int main(void) { string str1("test") ; string str2; str2 = str1; string str3(str1); str1[1]='t'; test(str1); }

就是常常把string的c_str()返回的const char*传给某个函数,由于很多函数往往是接受char *的这个时候,所以很多人都会简单的做一个强制转换,传给这个函数,而如果这个函数对传入的char*做修改的话,就杯具了。因为这个时候string对象不知道它被写入(WRITE)了,所以他没办法对它的复制string进行copy,这样所有共享这个string计数的字符串就都杯具了,全部被修改。所以这个情况下,对c_str()的值做强制转换一定要慎重、再慎重

你可能感兴趣的:(技术)