2010-06-29 24 views
2
//s_request_view() constructor is declared as below 
namespace Identity_VIEW 
{ 
Published_view_identity s_request_view("SAMPLE"); 
}; 

//The constructor is called in another source file as below, 
bind_view(Identity_VIEW::s_request_view); 

Ce même code fonctionne correctement sur Windows mais sur SBC (PowerPC) s_request_view est passé comme NULL.Pourquoi la variable globale n'est pas initialisée avec la chaîne ce que j'ai donné dans la variable externe

Quelqu'un peut-il s'il vous plaît m'aider à trouver pourquoi il se comporte différemment?

+0

Peut-on voir les attributs de Published_view_identity et son constructeur – Mark

+1

Aussi, 'bind_view' est appelé par le code" normal ", ou dans un autre global constructeur? –

+1

D'une certaine façon je parierais dans un autre constructeur global. –

Répondre

6

Je pense que la réponse ici est que le compilateur ne garantit pas l'ordre d'initialisation des variables globales. Si votre bind_view est appelée depuis le constructeur d'une autre variable globale, vous aurez un bug flottant.

Essayez d'utiliser l'approche suivante:

namespace Identity_VIEW 
{ 
    Published_view_identity & getRequestView() 
    { 
     static Published_view_identity s_request_view ("Sample"); 
     return s_request_view; 
    } 
} 

... 
bind_view(Identity_VIEW::getRequestView()); 

Cela peut aider à résoudre l'ordre de l'initialisation des variables globales. Néanmoins, cette solution n'est pas thread-safe (au cas où vous vous souciez) ...

+1

+1 pour montrer une méthode de type beaucoup plus sûre, access-is-initialization, et ensuite aller au-delà pour discuter des problèmes de sécurité des threads avec l'initialisation de s_request_view. – stinky472