Конструктор копирования 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!!");

Это напечатает «Вы попадете в ад МПК очень скоро !!» и это меня раздражает.

Это нормальное поведение 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!");

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

13

Решение

Вполне возможно, что ваш string Реализация использует копирование при записи, которое объясняет поведение. Хотя это менее вероятно для более новых реализаций (и несоответствующих в реализациях C ++ 11).

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

14

Другие решения

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

5

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector