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   51  

3 ответа:

указатель, возвращенный std::string::c_str() указывает на память поддерживается строковым объектом. Оно остается действительным до тех пор, пока не const функция вызывается для объекта string, или объект string является разрушенный. Строковый объект, о котором вы беспокоитесь, является временным. Он будет уничтожен в конце полного выражения, не раньше и не позже. не после. В вашем случае, конец полного выражения после звоните в consumer, Так что ваш код является безопасным. Это было бы не так, если бы consumer сохраненный указатель где-то, с идеей использовать его позже.

время жизни временных объектов строго определено с C++98. До этого он менялся в зависимости от компилятора и кода, который у вас есть написанный не работал бы с g++ (до 1995 года, примерно-g++ изменил это почти сразу же, когда комитет по стандартам проголосовал за него). (Там не было std::string тогда либо, но те же проблемы влияют любой пользователь написал строковый класс.)

временное std::stringсрок службы простирается сразу за точку, где consumer возвращает, поэтому безопасно использовать что-либо в этой строке С consumer. Что такое не OK-это сохранить значение, которое c_str возвращает и пытается использовать его позже (временный будет уничтожен, и мы можем только догадываться, что вы найдете на другом конце указателя).

временное значение, возвращаемое функцией random_string_generator (), можно безопасно использовать в функции consumer ().