Mam raczej podstawowe C++ pytanie, rozważmy funkcję, która pobiera niektóre parametry wejściowe i tworzy std::string
które z tych parametrów, takich jak ten poniżej:C++ powrocie tymczasowe obiekty zamieszanie
std::string constructString(int some_parameter) {
std::stringstream ss;
// Construct a string (arbitrarily complex)
ss << "Some parameter is " << some_parameter << " right now";
return ss.str(); //Am I not returning a temporary object here?
}
Rozumiem, że stringstream-object wyjdzie poza zakres, gdy funkcja zwróci, ale czy nie spowoduje to również unieważnienia konstruowanego łańcucha?
Co się stanie, jeśli zmienię typ zwrotu na const char *
i zamiast tego zwrócę numer ss.str().c_str()
?
Wygląda na to, że powyższy kod działa, ale podejrzewam, że dzieje się tak dlatego, że pamięć zawierająca "tymczasowy" obiekt nie została jeszcze zastąpiona przez coś innego, kiedy go używam?
Muszę przyznać, jestem raczej zdezorientowany w takich sytuacjach w ogóle, byłbym wdzięczny, gdyby ktoś mógł wyjaśnić te "tymczasowe przedmioty" - coś dla mnie (lub po prostu wskazać mi właściwy kierunek).
thx z góry
Zostanie wywołany destruktor po tym, jak ta kopia nie zostanie pobrana przez wywołanie funkcji constructString? Ponieważ jest to obiekt tymczasowy, zakładam, że wskaźnik jest przechowywany na stosie jako wartość zwracana. Co dzieje się po zwrocie? Czy zostanie zniszczony, jeśli nie ma nowego właściciela obiektu? Jak kompilator wie, że obiekt musi zostać zniszczony po jego zwróceniu? –