织梦CMS - 轻松建站从此开始!

罗索

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

jackyhwei 发布于 2011-06-11 21:28 点击:次 
string的c_str()返回的const char*传给某个函数,由于很多函数往往是接受char *的这个时候,所以很多人都会简单的做一个强制转换,传给这个函数,而如果这个函数对传入的char*做修改的话,就杯具了。
TAG:

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

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

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

  1. #include<iostream> 
  2. using namespace std; 
  3. void test(const string str) 
  4.         char* tmp = (char *)str.c_str(); 
  5.         tmp[1]='t'
  6. int main(void
  7.         string str1("test") ; 
  8.         string str2; 
  9.         str2 = str1; 
  10.         string str3(str1); 
  11.         str1[1]='t'
  12.         test(str1); 

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

(hitzhang)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201106/14548.html]
本文出处:CSDN博客 作者:hitzhang
顶一下
(1)
100%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容