Когда временные значения параметров выходят за рамки? [Дубликат]

Возможный дубликат:

Время жизни временных

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 () ...)Если приведенный выше код небезопасен, почему он небезопасен, и есть ли лучший, менее сжатый способ написать его, чем добавление временной переменной при выполнении вызовов функции? Если оно'почему безопасно?

Ответы на вопрос(2)

Ваш ответ на вопрос