Время уничтожения анонимной строки в C ++ - PullRequest
2 голосов
/ 05 августа 2020

У нас есть функция GetString(), которая возвращает std::string. Затем у нас есть функция ConsumeString(char*), которая использует строку в стиле C.

Запись ConsumeString(GetString().c_str()) - ошибка? Мне кажется, что это будет ошибкой, потому что после запуска c_str() исходная анонимная строка будет уничтожена, и у вас будет указатель на то, чего больше не существует. Но, как ни странно, он всегда работает нормально.

Я заметил, что это может быть проблемой только тогда, когда я пытался назначить GetString().c_str() переменной, а затем использовать ее в двух отдельных функциях ConsumeString(), после чего он напечатал поврежденную строку, и проблема стала очевидной. Но я не знаю, почему это работает в первом случае.

1 Ответ

2 голосов
/ 05 августа 2020

Если ConsumeString не выполняет асинхронную обработку const char*, предоставленного ему (прямо или косвенно), этот код очень безопасен.

Временный объект, возвращенный GetString(), будет активен до тех пор, пока функция ConsumeString не вернет , так что, если все дело в аргументе перед возвратом, все будет работать правильно.

В другом сценарии - я полагаю, у вас было что-то вроде этого:

 const char* s = GetString().c_str(); // 1
 ConsumeString(s); // 2

временно возвращенный GetString, был уничтожен после завершения строки 1, поэтому ConsumeString использовал недопустимый указатель.

Для более формальной формулировки относительно времени жизни временного объекта можно обратиться к cppreference , в частности

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

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