La vida útil de la función de las variables static
comienza la primera vez [0] el flujo del programa se encuentra con la declaración y que termina en la terminación del programa. Esto significa que el tiempo de ejecución debe realizar un mantenimiento de libros para poder destruirlo solo si realmente se construyó.
Adicionalmente ya que la norma dice que los destructores de objetos estáticos se deben ejecutar en el orden inverso al de la finalización de su construcción [1] y el orden de la construcción puede depender de la ejecución del programa específico, el fin de la construcción debe ser tomado en cuenta.
Ejemplo
struct emitter {
string str;
emitter(const string& s) : str(s) { cout << "Created " << str; << endl; }
~emitter() { cout << "Destroyed " << str << endl; }
};
void foo(bool skip_first)
{
if (!skip_first)
static emitter a("in if");
static emitter b("in foo");
}
int main(int argc, char*[])
{
foo(argc != 2);
if (argc == 3)
foo(false);
}
de salida:
C:> sample.exe
creado en foo
destruido en foo
C:> sample.exe 1
Creado en si
Creado en foo
Destruida en foo
Destruida en si
C:> sample.exe 1 2
Creado en foo
Creado en si
destruido en si
Destruida en foo
[0]
Desde C++ 98[2] no tiene referencia a múltiples hilos cómo se comportará en un entorno de subprocesos múltiples no especificado, y puede ser problemático como menciona Roddy.
[1]
C++ 98 sección 3.6.3.1
[basic.start.term]
[2]
en C++ 11 estática se inicializan de forma segura hilo, esto también se conoce como Magic Statics.
Normalmente no voto las preguntas donde el asker respondió de inmediato a sí mismo, pero este es interesante. Gracias por sacar el tema. –
@Motti Link está muerto. – Zaimatsu
@Zaimatsu el enlace todavía funciona para mí. – Motti