Подтвердить что ты не робот

Std::string конструктор копирования НЕ глубоко в GCC 4.1.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!!");

Это напечатает "Вы скоро попадете в адьюнджер 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!");

Он копирует содержимое в новую строку.

4b9b3361

Ответ 1

Вполне возможно, что ваша реализация string использует copy-on-write, которая объясняет поведение. Хотя это менее вероятно с более новыми реализациями (и несоответствие реализации С++ 11).

Стандарт не накладывает ограничений на значение указателя, возвращаемого c_str (кроме того, что он указывает на c-строку с нулевым завершением), поэтому ваш код по своей сути не переносится.

Ответ 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