2017-10-24 5 views
0

Ich habe versucht, auf diesem zu suchen, da ich wette, dass es solche Fragen schon gibt. Allerdings bekomme ich nur Themen über die Weitergabe durch Verweis in einer globalen Umgebung.Als Referenz übergeben, nur Kindbereich?

Ich wunderte mich über das Folgende;


Variable Umfang ist nur in dieser Funktion und wird gereinigt werden, wenn der Umfang verlassen

void Class::DoSomething(){ 
    String s = "localVariable"; 

    cout << s; 
} 

Wenn ich die vorherige Funktion in den beiden folgenden Funktionen ändern würde. Würde der Gültigkeitsbereich auch nur in der Elternfunktion sein und wird der Variablenspeicher freigegeben oder muss ich free() aufrufen?

void Class::DoSomethingParent(){ 
    String s = "localVariable"; //Local scope only 

    //This function uses the reference of my variable s. 
    Class::DoSomethingChild(s); 

    //Does the prior function do anything special because of the reference, 
    //so I have to call free(s)? 

    //Or does the variable still gets freed after leaving the scope of this function? 
} 
void Class::DoSomethingChild(String& value){ 
    cout << value; 
} 
+2

Sie müssen nichts Besonderes tun, 's' gehört zum Umfang von' DoSomethingParent' und wird zerstört sobald diese Funktion endet – CoryKramer

+2

Es gibt keine Notwendigkeit, etwas explizit zu befreien, 's' wird automatisch aufgeräumt, wenn der Umfang ist links. – user0042

+3

's' ist definiert als eine lokale Variable. Es spielt keine Rolle, dass Sie es durch Referenz zu einer anderen Funktion senden. Wenn der Bereich endet, wird der Speicher wie jede lokale Variable automatisch freigegeben. – Eli

Antwort

2

Objekte mit einer Automatische Speicherdauer in C++ sind im Wesentlichen in einem Funktionsblock Umfang deklarierten Objekte, dass Umfang besitztund steuert die Lebensdauer solcher Objekte darin geschaffen. Beispiel:

void function(){ 
    .... 
    String s = "Some Data"; 
    someFuncByReference(s); 
    .... 
} //All objects of automatic storage duration owned by this scope are destroyed here... 

Unabhängig davon, ob Sie das Objekt über einen Verweis oder die Adresse des Objektes übernehmen, und zu einer Funktion übergeben. Die aufgerufene Funktion someFuncByReference steuert immer noch nicht die Lebensdauer von s und sollte nicht s zerstören. Diese

gilt für jede „Funktion“, einschließlich, nicht Mitgliedsfunktionen, Mitgliedsfunktionen und Funktion Spezialisierungen von Vorlagen hergestellt. Beachten Sie, dass dies nicht identisch ist mit Datenelemente einer Klasse. Die Lebensdauer von Klassendatenelementen wird vom Konstruktor und Destruktor dieser Klasse gesteuert.


1: Wenn es jedoch der Fall ist, muss es eine andere schaffen Platzierung neue verwenden.

+0

Dies gilt auch für eine Klasseninstanz innerhalb einer Funktion definiert. Wie Klasse * classInstance = new Class(); Wenn Sie den Gültigkeitsbereich der Funktion verlassen, wird die Instanz automatisch zerstört. – Sliver2009

+1

@ Sliver2009 Ja, das ist immer wahr. Suche das RAII-Prinzip. – user0042

+0

@ user0042 Danke, ich werde es nachschlagen. – Sliver2009

Verwandte Themen