In C++, gli oggetti globali e statici vengono inizializzati prima dell'ingresso nella funzione main(). Tuttavia, lo standard non garantisce l'ordine di inizializzazione degli oggetti che si trovano in diverse unità di traduzione (file di compilazione, translation units). Questo può portare a quello che viene chiamato "static initialization order fiasco" — un bug in cui un oggetto globale fa riferimento a un altro che non è ancora stato inizializzato.
Per garantire un'inizializzazione corretta e evitare il problema, si utilizza il pattern "construct on first use": si dichiara una funzione che restituisce un riferimento a un oggetto statico locale (viene creato al primo invocamento in modo sicuro per i thread a partire da C++11).
// foo.h class Config { public: int value; }; Config& getConfig() { static Config config; config.value = 42; // inizializzazione garantita! return config; }
Se in due diversi file .cpp gli oggetti globali si creano a vicenda, cosa succede?
Risposta: Il risultato è indefinito, potrebbe verificarsi un accesso a un oggetto non inizializzato. La soluzione è sostituire l'inizializzazione globale diretta con quella pigra tramite un oggetto statico locale all'interno della funzione (vedi sopra).
Storia
-Nel sistema CRM, due moduli hanno dichiarato logger globali che si riferivano l'uno all'altro durante l'inizializzazione. In diverse build dell'applicazione, l'ordine di inizializzazione cambiava, si verificavano bug difficili da individuare: crash e logging su un puntatore nullo.
Storia
-Nel motore grafico, un oggetto globale contenitore per le risorse faceva riferimento al gestore delle risorse, che era anch'esso globale. Su Linux e Windows, i compilatori implementavano l'ordine di caricamento in modo diverso, si verificava dissincronizzazione e diversi crash.
Storia
-Un sviluppatore ha introdotto un'inizializzazione globale delle impostazioni, e successivamente un collega ha aggiunto un'altra variabile globale che dipendeva dalle impostazioni. Questo funzionava localmente e si rompeva su CI, dove avveniva un'altra organizzazione dei moduli.