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