13

我想知道我是否误解了一些东西:复制构造函数是否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!");

它将内容复制到新字符串中。

4

2 回答 2

14

您的string实现完全有可能使用写时复制来解释该行为。尽管对于较新的实现(并且不符合 C++11 实现),这种情况不太可能发生。

该标准对返回的指针的值没有任何限制c_str(除了它指向一个以 null 结尾的 c 字符串),因此您的代码本质上是不可移植的。

于 2013-05-17T08:46:52.880 回答
5

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

于 2013-05-17T08:50:43.723 回答