2017-02-03 1 views
0

voir le code suivant:durée de vie d'une variable statique dans une fonction

#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 
} 

pourquoi get1 appelle la deconstructor mais get2 ne fonctionne pas? autant que je sache, les variables statiques détruisent quand vous terminez le programme! mais pourquoi après avoir appelé get1 programme appelle le déconstructeur de la variable statique?

J'ai un poste similaire lire à:

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

quelqu'un dit là que: «La durée de vie des variables statiques de fonction commence la première fois [0] le déroulement du programme rencontre la déclaration et se termine à la fin du programme. "

cela ne semble pas être vrai ici!

+1

Pourquoi le deuxième appelait-il le destructeur? Il est créé en utilisant new, sans suppression correspondante. C'est une fuite de mémoire! Vous affectez également le nouvel objet à une référence, ce qui signifie qu'il n'est plus possible d'obtenir son adresse pour appeler la suppression. –

Répondre

6

get1() n'appelle pas ~T(). La façon simple de prouver qu'il appelle get1() plusieurs fois:

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

L'extrait de code ci-dessus affiche uniquement "deconstructor calling" une fois.

coliru example


pourquoi get1 appelle la deconstructor mais get2 ne fonctionne pas?

Le destructor vous appelle vous voyez se passe à la fin du programme, lorsque le static T x défini dans get1() est détruit.

Le x défini dans get2() ne soit pas détruite car il est tas alloué. Vous devez delete ou, mieux encore, utiliser un std::unique_ptr.

coliru example


BTW, le terme correct est "destructor".

+0

pourquoi il n'appelle le déconstructeur qu'une seule fois? pourquoi get2 ne l'appelle pas? – MEMS

+0

@MEMS: vient d'éditer ma réponse. –

3

pourquoi get1 appelle le déconstructeur, mais pas le get2?

Notez la différence entre get1() et get2(). La variable statique get1() est de type T, lorsqu'elle est détruite à la fin du programme, le destructeur de T est appelé.

Le viariable statique dans get2() est de type T& (à savoir une référence à T) et initialisé à partir d'un objet construit via new. Lorsqu'il est détruit à la fin du programme, le destructeur de T ne sera pas appelé.Ce n'est pas spécial pour les variables statiques, c'est aussi vrai pour les variables locales. Les horaires de destruction sont différents mais les comportements sont les mêmes; l'objet construit est divulgué.