Kiedy tymczasowe wartości parametrów wykraczają poza zakres? [duplikować]
Możliwy duplikat:
Czas życia tymczasowych
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());
Powyższy przykład można łatwo przepisać, aby używać inteligentnych wskaźników zamiast łańcuchów; Spotkałem obie te sytuacje wiele razy. W każdym razie powyższy przykład skonstruuje łańcuch STL w ModernFunction, zwróci go, a następnie weźmie wskaźnik do łańcucha w stylu C wewnątrz obiektu łańcuchowego, a następnie przekaże ten wskaźnik do poprzedniej funkcji.
Istnieje tymczasowy obiekt ciągu, który istnieje po zwróceniu funkcji ModernFunction. Kiedy wychodzi poza zakres?Czy kompilator może wywołać c_str (), zniszczyć ten tymczasowy obiekt ciągu, a następnie przekazać zwisający wskaźnik do funkcji LegacyFunction? (Pamiętaj, że obiekt string zarządza pamięcią zwracaną przez wartość c_str () do ...)Jeśli powyższy kod nie jest bezpieczny, dlaczego nie jest bezpieczny, i czy istnieje lepszy, równie zwięzły sposób na jego zapisanie niż dodanie tymczasowej zmiennej podczas wywoływania funkcji? Jeśli to bezpieczne, dlaczego?