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!");
Он копирует содержимое в новую строку.
Ответы
Ответ 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