Rückkehr ist eine C++ - std::string-Objekts sicher von memory leaks?
Ich bin ziemlich Anfänger mit C++ - strings, so dass die folgenden Muster kann ein wenig fugly. Ich bin der überprüfung einige code, den ich geschrieben habe, bevor Anfang Integrationstest mit einem größeren system. Was ich wissen möchte ist, ob es sicher ist, oder ob es anfällig für Speicherlecks?
string somefunc( void ) {
string returnString;
returnString.assign( "A string" );
return returnString;
}
void anotherfunc( void ) {
string myString;
myString.assign( somefunc() );
//...
return;
}
Verständnis, das ich habe ist, dass der Wert der returnString zugewiesen ist, ein neues Objekt myString und dann die returnString Objekt zerstört wird, als Teil der Lösung der Aufruf von somefunc. Irgendwann in der Zukunft, wenn myString geht out of scope, es ist auch zerstört.
Hätte ich normalerweise übergeben Sie einen Zeiger auf myString in somefunc() und direkt zugeordnete Werte myString, aber ich bin bemüht zu sein, ein wenig klarer in meinem code ( und sich auf der Seite Effekt-Funktion, Stil weniger ).
- In der ersten Funktion, könnten Sie wahrscheinlich tun Sie einfach "return string("string");" und das gleiche Ergebnis.
- Dies ist ein Vereinfachtes Beispiel, um das problem zu veranschaulichen.
- auch
return "A string";
ist in Ordnung, da std::string sind bebaubar mit c-strings. - Stimmt, ich vergaß.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, die RÜCKFÜHRUNG einer
string
diese Weise (von Wert) ist sicher,allerdings würde ich es vorziehen, weisen Sie Sie auf diese Weise:Dies ist leichter zu Lesen, und auch effizienter ist (spart den Bau einer leeren Zeichenfolge, die würden dann überschrieben, wenn der nächste Aufruf von
assign
).std::string
verwaltet seinen eigenen Speicher, und es hat richtig geschrieben, copy-Konstruktor und Zuweisungsoperator, so ist es sicher zu bedienen Saiten auf diese Weise.Ja by doing
Werden Sie den Aufruf der string -copy-Konstruktor. Die führt einer Kopie* der returnString in die temporäre (aka rValue), die anstelle der "somefunc()" in den aufrufenden Ausdruck:
Dies ist wiederum vergangen, zu ordnen und durch zuweisen führen Sie eine Kopie in myString.
Also in deinem Fall, das copy-Konstruktor von string garantiert eine Tiefe Kopie und gewährleistet, dass keine Speicherverluste.
* Hinweis: dies kann oder möglicherweise keine wahre Tiefe Kopie, das Verhalten des copy-Konstruktors ist die Umsetzung-spezifisch. Einige string-Bibliotheken implementieren copy-on-write, die einige interne Buchführung, um zu verhindern, dass das kopieren, bis diese tatsächlich benötigt werden.
Bist du völlig sicher, weil Sie die Rückgabe der string-Wert, wo der string "kopiert" und nicht by-reference. Wenn Sie waren zurückgeben
std::string &
, dann würden Sie es tun falsch, als hätten Sie einen baumelnden Referenz. Einige Compiler, selbst, durchführen kann return-Wert-Optimierung, die nicht mal richtig kopieren Sie die Zeichenfolge nach der Rückkehr. Sehen dieser Beitrag für weitere Informationen.Ja, es ist (zumindest in der Regel) sicher. Einer der grundlegendsten Beiträge von fast jedem angemessenen string-Klasse ist die Fähigkeit, zu handeln wie ein Basis-Wert für die normale Zuweisung, Rückgabe, etc., "einfach funktionieren".
Wie gesagt, ein string
returnString
innerhalbsomefunc
und eine Kopie wieder gegeben, wenn die Funktion zurückgibt. Dies ist vollkommen sicher.Was Sie wollen, ist, eine Referenz zu geben, um
myString
zusomefunc
(keine Zeiger). Es wird vollkommen klar:What you want is to...
warum sagen Sie das? Ich sehe wenig Vorteil, um Ihren code über das, was er tut.