2010-08-01 21 views
0

J'ai le code suivant:C++ membres statiques

void Foo() { 

    static std::vector<int>(3); 

    // Vector object is constructed every function call 

    // The destructor of the static vector is invoked at 
    // this point (the debugger shows so) 
    // <------------------- 

    int a; 
} 

Ensuite, quelque part j'appelle Foo plusieurs fois dans une séquence

Pourquoi l'objet vectoriel se construit sur chaque appel Foo() et pourquoi est destructeur appelé juste après static ... déclaration?


Mise à jour:

je tentais de mettre en œuvre la fonction une fois appeler mécanisme et je pensais que l'écriture quelque chose comme

static core::CallOnce(parameters)CallOnce est un nom de classe serait très agréable.

À mon avis, écrire static core::CallOnce call_once(parameters) semble pire, mais d'accord, c'est le cas je ne peux rien faire avec.

Merci.

Répondre

12

votre variable a besoin d'un nom:

static std::vector<int> my_static_vector(3); 
+4

Pourquoi cela a-t-il été baissé instantanément? –

+0

@Michael: Bonne question. Doit trouver celui qui maintient downvoting sans laisser un commentaire flippant! C'est ce qu'ils sont pour! (Oh, et +1) –

+0

@James Savez-vous par hasard, pourquoi cela arrive-t-il? Pourquoi un objet sans nom, qui fonctionne dans le constructeur, ne peut-il pas être une variable statique "normale" et ne pas être détruit par construction? –

7

Vous avez oublié de donner le vecteur un nom, donc sans pointage variable ce qu'elle soit détruite immédiatement après sa création

+0

+1 pour * aussi * étant une bonne réponse. –

4

Parce que std::vector<int>(3) crée un temporaire sans nom, qui ne vit qu'à la fin de son expression contenue. Le débogueur ne peut pas montrer la destruction dans la même ligne que la construction, donc il le montre sur la ligne suivante.

Attribuez un nom à l'élément et une sémantique normale static s'appliquera.

+0

Lol - tout le monde ne s'entasse pas tout de suite! –