2010-02-17 18 views
9

Supongamos que tengo:destructor estática

void foo() { 
    static Bar bar; 
} 

¿Tiene C++ me garantiza que Bar :: Bar() se llama en la barra y barra de bar :: ~() no se llama en la barra? (Hasta después de las salidas principales).

Gracias!

Respuesta

13

Sí. La primera vez que se llama foo(), se construirá Bar bar. Luego estará disponible hasta que finalice el main(), luego de lo cual será destruido.

Básicamente se trata de:

static Bar *bar = 0; 
if (!bar) 
{ 
    bar = new Bar; 

    // not "real", of course 
    void delete_bar(void) { delete bar; } 
    atexit(delete_bar); 
} 

Nota dije "esencialmente"; esto probablemente no es lo que realmente sucede (aunque no creo que esté demasiado lejos).


3.7.1 duración de almacenamiento estático
1 Todos los objetos que no tienen una duración de almacenamiento dinámico ni son locales tienen una duración de almacenamiento estático. El almacenamiento para estos objetos durará por la duración del programa (3.6.2, 3.6.3).