Когда временные значения параметров выходят за рамки? [Дубликат]
Возможный дубликат:
Время жизни временных
int LegacyFunction(const char *s) {
// do something with s, like print it to standard output
// this function does NOT retain any pointer to s after it returns.
return strlen(s);
}
std::string ModernFunction() {
// do something that returns a string
return "Hello";
}
LegacyFunction(ModernFunction().c_str());
Приведенный выше пример можно легко переписать, чтобы использовать умные указатели вместо строк; Я'Мы сталкивались с обеими этими ситуациями много раз. В любом случае, приведенный выше пример создаст строку STL в ModernFunction, вернет ее, затем получит указатель на строку в стиле C внутри строкового объекта и затем передаст этот указатель унаследованной функции.
После возврата ModernFunction существует временный строковый объект. Когда это выходит за рамки?Возможно ли, чтобы компилятор вызвал c_str (), уничтожил этот временный строковый объект и затем передал висячий указатель на LegacyFunction? (Помните, что строковый объект управляет памятью, на которую указывает возвращаемое значение c_str () ...)Если приведенный выше код небезопасен, почему он небезопасен, и есть ли лучший, менее сжатый способ написать его, чем добавление временной переменной при выполнении вызовов функции? Если оно'почему безопасно?