std:: string:: c str () и temporaries
хорошо сформирован следующий код на C++:
void consumer(char const* p)
{
std::printf("%s", p);
}
std::string random_string_generator()
{
// returns a random std::string object
}
consumer(random_string_generator().c_str());
проблема, с которой я столкнулся, заключается в том, что после создания временного объекта std::string и взятия указателя c_str() ничто не мешает объекту std::string быть уничтоженным (или, может быть, я ошибаюсь?). Не могли бы вы указать мне на стандарт, если код в порядке, несмотря ни на что. Это действительно работает, когда я тестирую с g++.
3 ответа:
указатель, возвращенный
std::string::c_str()
указывает на память поддерживается строковым объектом. Оно остается действительным до тех пор, пока не const функция вызывается для объекта string, или объект string является разрушенный. Строковый объект, о котором вы беспокоитесь, является временным. Он будет уничтожен в конце полного выражения, не раньше и не позже. не после. В вашем случае, конец полного выражения после звоните вconsumer
, Так что ваш код является безопасным. Это было бы не так, если быconsumer
сохраненный указатель где-то, с идеей использовать его позже.время жизни временных объектов строго определено с C++98. До этого он менялся в зависимости от компилятора и кода, который у вас есть написанный не работал бы с g++ (до 1995 года, примерно-g++ изменил это почти сразу же, когда комитет по стандартам проголосовал за него). (Там не было
std::string
тогда либо, но те же проблемы влияют любой пользователь написал строковый класс.)
временное
std::string
срок службы простирается сразу за точку, гдеconsumer
возвращает, поэтому безопасно использовать что-либо в этой строке Сconsumer
. Что такое не OK-это сохранить значение, котороеc_str
возвращает и пытается использовать его позже (временный будет уничтожен, и мы можем только догадываться, что вы найдете на другом конце указателя).