写时拷贝(Copy-On-Write)技术,常用于对象的复制中,比如STL类std::string就用了这个常见的技术。简单描述一下就是:当调用string的拷贝构造函数或者=operator时,string复制对象并不急于的从堆上开辟新的内存来保存来源string对象的值,而是简单的引用来源string对象的地址,完成了一次轻量级的拷贝。如果接下来你通过来源string的修改接口函数对源string的内容进行了修改,那么这个时候实质上的copy才会发生,string复制对象才会通过从堆上开辟新的内存来完成copy。其中保证string的COW正确性是通过引用计数来实现的(先不说它了)。 正因为如此,继续说一下一个常犯的错误: 通常写C++程序的同学,也会用大量的C函数,尤其是字符串的操作函数,这个时候的常用场景如下:
就是常常把string的c_str()返回的const char*传给某个函数,由于很多函数往往是接受char *的这个时候,所以很多人都会简单的做一个强制转换,传给这个函数,而如果这个函数对传入的char*做修改的话,就杯具了。因为这个时候string对象不知道它被写入(WRITE)了,所以他没办法对它的复制string进行copy,这样所有共享这个string计数的字符串就都杯具了,全部被修改。所以这个情况下,对c_str()的值做强制转换一定要慎重、再慎重 (hitzhang) |