2011-04-28 4 views
1

S'il vous plaît aider,variables statiques pour libérer

Le problème: coredumps, dans le code suivant:

J'ai un SomeOtherClass de classe abstraite, et ont dérivé de ce SomeOtherClassImpl.

Voici le code qui provoque la peine:

class MyClass 
{ 

public: 

    void someFunction() 
    { 
    myVector().push_back(someOtherClassDefault()); 
    } 

private: 

    static std::vector<SomeOtherClass const *> & myVector() 
    { 
    static std::vector<SomeOtherClass const *> theVector; 
    return theVector; 
    } 

    static SomeOtherClass const * someOtherClassDefault() 
    { 
    static SomeOtherClassImpl theDefault; 
    return &theDefault; 
    } 

}; 

J'ai quelques variables statiques de MyClass type dans d'autres unités de traduction.

Le problème est étrange car une erreur de segmentation se produit lorsque le programme se termine. Bien sûr, la Default peut être désaffectée avant le Vector, mais quelle est la différence? Les deux ont été désaffectés quand le main est déjà fait.

Vous nous aiderez beaucoup.

+3

Je ne vois rien de manifestement faux avec le code ci-dessus, donc vous devez probablement fournir une version réduite de 'SomeOtherClassImpl'. Si vous exécutez votre application dans un débogueur, quel est le backtrace quand le seg-fault se produit? –

+1

Et vous pensez que ce qui se passe après que "main is already done" ne vous concerne pas? –

+0

Nikolai, merci pour ton commentaire motivant :) mais tu as raison, c'est mon affaire, et c'est en fait mon erreur. –

Répondre

4

Vous rencontrez probablement le fiasco d'initialisation statique, juste à l'opposé. Fondamentalement, l'ordre de la destruction des objets de la durée statique est l'ordre inverse de la création de la même chose. Donc, si vous avez:

void foo() { 
    static type a; 
} 
void bar() { 
    static type b; 
} 
int main() { 
    foo(); 
    bar(); 
} 

La construction va créer d'abord a, puis b, quand main est terminée, il va détruire b alors a. Si vous changez l'ordre des appels en main, la commande sera inversée. Vous devez être conscient lorsque vous traitez des variables de durée statique sur les dépendances pour cette raison particulière.

+1

Oui, mais pouvez-vous voir dans le code OP pourquoi la commande est importante? Je ne peux pas. –

+0

Je ne peux pas non plus. Il y a probablement un autre code qui accède à l'un de ces objets après qu'ils ont été détruits. – hammar

+0

Je ne peux pas le voir dans le code, mais de la description cela semble être le problème. Il s'agit très probablement d'une version simplifiée, où le vecteur remplace une autre classe qui accède réellement à l'argument de destruction. Dites une classe qui contient le vecteur et qui, lors de la destruction, itère sur les éléments et appelle une fonction membre. Dans ce cas, la classe serait créée avant les éléments, et pendant la destruction de cette classe, l'itération toucherait les objets détruits. –