Jestem dość początkujący z ciągami C++, więc poniższy wzór może być trochę nieostry. Sprawdzam kod, który napisałem przed rozpoczęciem testowania integracji z większym systemem. Chciałbym wiedzieć, czy jest to bezpieczne, czy też może być narażone na wyciekanie pamięci?Powoduje zwrócenie obiektu C++ std :: string z wycieków pamięci?
string somefunc(void) {
string returnString;
returnString.assign("A string");
return returnString;
}
void anotherfunc(void) {
string myString;
myString.assign(somefunc());
// ...
return;
}
Zrozumienie mam to, że wartość returnString jest przypisana do nowego obiektu myString a następnie obiekt returnString ulega zniszczeniu w ramach rozwiązywania wezwanie do somefunc. W pewnym momencie w przyszłości, gdy myString wykracza poza zakres, jest on również niszczony.
Zazwyczaj przekazywałbym wskaźnik do myString do somefunc() i bezpośrednio przypisany do wartości do myString, ale staram się być trochę bardziej klarowny w moim kodzie (i polegając na stylu funkcji efektu ubocznego mniej).
W pierwszej funkcji prawdopodobnie mógłbyś po prostu "zwrócić ciąg znaków (" Ciąg znaków ");" i mają ten sam rezultat. – luiscubal
@luiscubal Jest to uproszczony przykład ilustrujący problem. – Stephen
@luiscubal nawet 'return" Łańcuch ";' jest w porządku, ponieważ std :: string można skonstruować za pomocą ciągów c. – log0