2013-08-02 10 views
5

Mi chiedevo se qualcuno potesse far luce sui processi di deallocazione della memoria in C++.Quando viene rilasciata la memoria in relazione a variabili statiche?

Se ho una struct che dichiaro statica, in modo tale che di costruttore è la prima cosa da eseguire e suo distruttore è l'ultima cosa da eseguire:

struct initializer execute_before_and_after_main { 
    initializer() { init(); } 
    ~initializer() { cleanup(); } 
} 
static initializer execute_around_main; 

E poi ho qualcosa di simile:

class my_class { 
    my_object objects[100]; 
} 
extern my_class gobal_my_class; 
my_class global_my_class; 

e principale non è importante qui:

int main (int argc, char* argv[]) { 
    .... 
} 

Quando cleanup() viene chiamato, l'array objects contiene ora una memoria deallocated/invalid? Esiste una sequenza standard di inizializzazione/distruzione che C++ implementa qui a cui qualcuno potrebbe indirizzarmi?

Grazie

EDIT: Capisco che questo tipo di codice non è forse la migliore pratica, ma sto ancora chiedendo se il comportamento è definito.

+5

tempo per acquisire familiarità con [durata di conservazione] (http://en.cppreference.com/w/cpp/language/storage_duration) –

+0

@CaptainObvlius lol Stavo per inserire lo stesso link nella mia risposta – aaronman

+1

Non esiste una sequenza definita standard per l'inizializzazione e la distruzione di oggetti con durata di archiviazione statica; questo è indicato come [fiasco dell'ordine di inizializzazione statico] (http://www.parashift.com/c++-faq/static-init-order.html) – Praetorian

risposta

3

Le variabili statiche e globali hanno entrambi static storage duration, ovvero vengono liberate al termine del programma. Dalla lettura di uno dei duplicati ho scoperto che se il codice è tutto nella stessa unità di traduzione (che è il tuo), gli oggetti con memoria statica vengono distrutti nell'ordine inverso di costruzione. Se gli oggetti sono in diverse unità di traduzione, non puoi garantire nulla.

Quando cleanup() viene chiamato, l'array di oggetti contiene ora la memoria deallocated/invalid?

Sì, ma non ha molta importanza in quanto è chiamato solo una volta che l'oggetto è fuori portata

È global_my_class distrutto prima execute_around_main?

sì, la mia classe mondiale è distrutto in primo luogo perché è inizializzato ultima

+0

"Esiste una sequenza standard di inizializzazione/distruzione che C++ implementa qui" Il fatto che siano entrambi liberati quando il programma finisce NON risolve la domanda se la memoria di 'global_my_class' è valida durante la distruzione di execute_around_main' . –

+0

@MooingDuck quindi se rispondo solo alla metà della domanda che senti il ​​bisogno di downvotare, cercherò di correggere la risposta ma non sono al 100% chiaro su cosa sta cercando di chiedere – aaronman

+0

"Quando viene chiamato cleanup(), è il array di oggetti ora contenente memoria deallocated/invalid? " -> "È' global_my_class' distrutto prima di 'execute_around_main'?" –

Problemi correlati