的std :: string的拷贝构造函数不深的GCC 4.1.2?(std::string cop

2019-09-03 23:35发布

我不知道如果我误解的东西:它从一个拷贝构造函数std::string 不能复制它的内容?

string str1 = "Hello World";
string str2(str1);

if(str1.c_str() == str2.c_str()) // Same pointers!
  printf ("You will get into the IPC hell very soon!!");

这将打印“你会进入IPC地狱很快!” 它让我很烦。

这是正常行为std::string ? 我读的地方,它通常不会深副本。

然而,这种按预期工作:

string str3(str1.c_str());

if(str1.c_str() == str3.c_str()) // Different pointers!
  printf ("You will get into the IPC hell very soon!!");
else
  printf ("You are safe! This time!");

它的内容复制到新的字符串。

Answer 1:

这是完全有可能的,你的string实现使用写入时复制这可以解释的行为。 尽管这是较新的实现方式(以及在C ++ 11个实现不符合要求的)的可能性较小。

该标准对返回的指针的值没有限制c_str (除了它指向一个空结尾的C字符串),那么你的代码本身是不可移植。



Answer 2:

std::string在你的编译器实现必须进行引用计数。 更改其中一个字符串,然后再次检查指针 - 他们会有所不同。

string str1 = "Hello World";
string str2(str1);

if(str1.c_str() == str2.c_str()) // Same pointers!
  printf ("You will get into the IPC hell very soon!!");

str2.replace(' ',',');

// Check again here.

这是3篇引用计数串优秀文章。

http://www.gotw.ca/gotw/043.htm

http://www.gotw.ca/gotw/044.htm

http://www.gotw.ca/gotw/045.htm



文章来源: std::string copy constructor NOT deep in GCC 4.1.2?