2017-02-03 2 views
0

den folgenden Code sehen:Lebensdauer einer statischen Variablen in einer Funktion

#include <iostream> 
using namespace std; 
struct T 
{ 
    ~T() 
    { 
     cout << "deconstructor calling\n"; 
    } 
}; 
static T& get1() 
{ 
    static T x; 
    return x; 
} 
static T& get2() 
{ 
    static T& x = *new T; 
    return x; 
} 
int main() 
{ 
    get1();//calls the deconstructor 
    get2(); //dosent call the deconstructor 
} 

warum get1 die Deconstructor nennt aber get2 nicht? Soweit ich weiß, zerstören die statischen Variablen beim Beenden des Programms! aber warum nach dem Aufruf get1 Programm ruft den Dekonstruktor der statischen Variable?

Ich habe einen lesen ähnlich den Beitrag bei:

What is the lifetime of a static variable in a C++ function?

jemand sagt, daß es: "Die Lebensdauer der Funktion statischen Variablen das erste Mal beginnt [0] der Programmablauf trifft die Erklärung, und es endet bei Beendigung des Programms. "

das scheint hier nicht zu stimmen!

+1

Warum sollte der zweite jemals den Destruktor aufrufen? Es wird mit neuen erstellt, ohne entsprechende Löschung. Es ist ein Speicherleck! Sie weisen das neue Objekt auch einer Referenz zu, dh es ist nicht mehr möglich, die Adresse des Benutzers zum Löschen zu erhalten. –

Antwort

6

get1() ruft nicht ~T(). Der einfache Weg, um es zu beweisen, ruft get1() mehrfach:

int main() 
{ 
    get1(); 
    get1(); 
    get1(); 
    get2(); 
    get2(); 
    get2(); 
} 

Der obige Code-Schnipsel nur "deconstructor calling" einmal angezeigt werden.

coliru example


warum nennt get1 den Deconstructor aber get2 nicht?

Der Destruktor rufen Sie geschieht am Ende des Programms zu sehen, wenn die static T x in get1() definiert zerstört wird.

Die x in get2() definiert bekommt automatisch nicht zerstört, weil es Heap zugeordnet ist. Sie müssen delete es oder, noch besser, verwenden Sie eine std::unique_ptr.

coliru example


BTW, ist der richtige Begriff "destructor".

+0

von warum es den Dekonstruktor nur einmal aufruft? Warum ruft Get2 es nicht an? – MEMS

+0

@MEMS: gerade meine Antwort bearbeitet. –

3

warum get1 ruft den Dekonstruktor aber get2 nicht?

Beachten Sie den Unterschied zwischen get1() und get2(). Die statische Variable in get1() ist vom Typ T, wenn sie bei Programmbeendigung zerstört wird, wird der Destruktor von T aufgerufen.

Die statische viariable in get2() ist vom Typ T& (d.h. ein Verweis auf T) und von einem Objekt konstruiert über new initialisiert. Wenn es bei Programmbeendigung zerstört wird, wird der Destruktor von T nicht aufgerufen.Dies ist nicht speziell für statische Variablen, das gilt auch für lokale Variablen. Die Zerstörungszeitpunkte sind unterschiedlich, aber die Verhaltensweisen sind gleich; das konstruierte Objekt ist durchgesickert.

Verwandte Themen