2013-02-04 5 views
38

Esiste un ordine definito in cui le variabili locali sono deallocate in C++ (11)? Per essere più concisi: in quale ordine saranno visibili gli effetti collaterali dei distruttori di due variabili locali nello stesso ambito?Ordine di distruzione delle variabili locali C++

es .:

struct X{ 
    ~X(){/*do something*/} 
} 

int main(){ 
    X x1; 
    X x2; 
    return 0; 
} 

È x1 o x2 distrutti prima quando principale ritorna o è l'ordine indefinito in C++ 11?

risposta

47

All'interno di ciascuna categoria di classi di memoria (tranne gli oggetti con legatura dinamica), gli oggetti vengono distrutti nell'ordine inverso di costruzione.

+3

Quale parte dello standard C++ garantisce questo ordine? –

+11

@DavidGrayson Una parte diversa per ogni categoria. Per oggetti con memoria locale o statica , vedere §3.6.3. Per oggetti con auto durata vedi §6.6 (che è _non_ dove ci si potrebbe aspettare di cercare ). Per i membri della classe e le basi, vedi §12.4/8. Per i provvisori, vedere §12.2. –

+3

I temporali non seguono strettamente l'ordinamento LIFO, a causa dell'estensione a vita quando un riferimento si lega direttamente a uno. –

2

Saranno distrutti seguendo un ordine inverso della loro costruzione.

+0

In realtà, in ordine inverso della loro costruzione. –

+0

sì, questo è quello che sto dicendo. – UmNyobe

4

Sono distrutti in ordine inverso di allocazione, vedere this SO question. In questo caso, ciò significa che x2 verrà distrutto prima dello x1.

5

Questo è un comportamento Stack Data Structure, quindi le variabili locali vengono archiviate in Stack come struttura dati , è possibile immaginare che in una struttura di dati LIFO, l'ultima variabile aggiunta alla struttura deve essere la prima da rimuovere. le variabili sono removed dallo stack nell'reverse order nell'ordine della loro aggiunta.

+1

Le pile sono LIFO, non FIFO. (Le code sono FIFO.) – Spire

16

I. A proposito di variabili locali

  1. Le variabili locali sono assegnati sulla Stack.

  2. Il Pila si basa su un (Last-In-First-Out) modello LIFO.

  3. Quindi le variabili vengono distrutte e deallocate nell'ordine inverso di allocazione e costruzione.

II.A proposito di tuo esempio

La funzione main() si chiama:

  • x1 assegnata e costruito sulla Stack,
  • x2 viene allocata e costruito sul Stack

e quando viene raggiunta la fine dell'ambito della funzione main():

  • x2 viene distrutto e deallocato dal Stack,
  • x1 è distrutta e deallocata dal Stack

III. Inoltre

Il Pila simile a questa:

(Comportamento del Stack sembra più comprensibile con uno schema)

Stack scheme