C++ · Avançado · Inglês · Técnico
static initialization order fiasco
Bug em que um objeto global de uma unidade de tradução usa outro global de outra unidade antes de ele ser inicializado, pois a ordem entre arquivos não é definida.
Onde usar
Aparece como crash antes do main, em singletons e globais que dependem uns dos outros. A solução comum é trocar o global por uma variável estática local, inicializada no primeiro uso.
Em código
// a.cpp
std::string nome = "x";
// b.cpp
size_t n = nome.size(); // pode ser antes
std::string& nome2() {
static std::string s = "x";
return s; // inicializa no 1º uso
}Exemplos
That crash before main is the static initialization order fiasco.
Esse crash antes do main é o static initialization order fiasco.
Wrap the global in a function with a local static.
Embrulhe o global em uma função com um static local.
Cuidado
Dentro de uma mesma unidade de tradução a ordem é a de definição; o problema é só entre arquivos diferentes.
Sinônimos
fiasco da ordem de inicialização