Интересно, я что-то неправильно понял: делает ли конструктор копирования из 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!!");
Это напечатает «Вы попадете в ад МПК очень скоро !!» и это меня раздражает.
Это нормальное поведение 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!");
Копирует содержимое в новую строку.
Вполне возможно, что ваш string
Реализация использует копирование при записи, которое объясняет поведение. Хотя это менее вероятно для более новых реализаций (и несоответствующих в реализациях C ++ 11).
Стандарт не ограничивает значение указателя, возвращаемого c_str
(кроме того, что он указывает на ноль-оканчивающуюся c-строку), так что ваш код по своей природе непереносим.
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