Время жизни объекта, возвращаемого std :: string :: substr - PullRequest
2 голосов
/ 04 октября 2019

Мне нужно знать, действительно ли в целом следующее:

string s = "some value";
string v = s.substr(0, 50).c_str();

Всегда ли присвоение v всегда? Могут ли быть какие-либо проблемы из-за временного времени жизни объекта, возвращаемого substr().

Ответы [ 4 ]

9 голосов
/ 04 октября 2019

Это действительно здесь. временный , возвращаемый substr, уничтожается после полного выражения;который включает в себя инициализацию v.

Все временные объекты уничтожаются как последний шаг в оценке полного выражения, которое (лексически) содержит точку, где они были созданы, и, если несколько временных объектовбыли созданы, они уничтожены в порядке, противоположном порядку создания. Это верно даже в том случае, если эта оценка заканчивается выдачей исключения.

Кстати: это не присваивание, а инициализация (построение) v.

4 голосов
/ 04 октября 2019

Назначение v действительно. Временные объекты не уничтожаются до тех пор, пока не закончится конец всего оператора (когда достигнут ;), то есть после завершения присваивания.

Однако в этом конкретном примере использование c_str() является избыточным и неэффективным. Требуется итерация данных char для определения их длины, которую временная string, возвращаемая substr(), уже знает, поэтому просто присвойте возвращенные string как есть:

string v = s.substr(0, 50);
0 голосов
/ 04 октября 2019

После того, как вы присвоили переменную, она находится под защитой области действия переменной. Как я уже сказал, он не изменится, пока вы его не измените, или он потеряет сферу действия. Существует только «временная жизнь», если у вас есть вложенный экземпляр.

Моя собственная цитата выше. Все, о чем вы спрашиваете: «Как или когда функция .substr ищет ее в памяти, и остается ли она в памяти?»Ответ - его копия в присвоении левому значению. Учитывая это, действие функции .substr на память теряется. Так что да, это временно. Но, как я уже смутно утверждал, это временно для области действия переменной.

0 голосов
/ 04 октября 2019

substr возвращает вновь созданный строковый объект со значением, инициализированным для копии подстроки этого объекта.

Таким образом, вы в безопасности

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...