ExpertiDict

C++ · Avançado · Inglês · Técnico

static initialization order fiasco

ˈstæt.ɪk ɪˌnɪʃ.iˈeɪ.ʃən ˈɔːɹ.dɚ fiˈæs.koʊsubstantivo

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

Veja também

Todos os termos de C++