2010-04-09 16 views
8

C++ chiama automaticamente i distruttori di tutte le variabili locali nel blocco in ordine inverso indipendentemente dal fatto che il blocco venga chiuso normalmente (il controllo cade) o viene generata un'eccezione.Come si distrugge le variabili locali quando si esce da un blocco normalmente chiamato in C++?

Sembra che il termine stack unwinding si applica solo a quest'ultimo. Come si chiama il processo precedente (la normale uscita del blocco) riguardante la distruzione di variabili locali?

+1

In realtà non si chiama nulla. Ovunque nello standard, dice cose come "... le variabili automatiche vengono distrutte alla fine del blocco". Non dà mai a quel processo un nome. – GManNickG

+0

@GMan - Save the Unicorns: Immagino che potresti aggiungere questo come risposta. Menzionare ciò che dice lo standard è un argomento forte. – sharptooth

risposta

5

Un oggetto viene automaticamente distrutto quando "esce dal campo". Questo potrebbe essere definito "recupero automatico della memoria", ma in realtà si riferisce alla raccolta dei dati inutili (ci sono diversi documenti con quella frase nel loro nome che usano il termine per indicare la raccolta dei dati inutili). Quando viene utilizzato per garantire il corretto abbinamento di apertura/chiusura, blocco/sblocco o altre forme di acquisizione delle risorse con la loro versione appropriata, è noto come modello di progettazione di Resource Acquisition is Initialization (RAII), che è piuttosto ironico dato che l'aspetto principale di RAII non è l'inizializzazione o l'acquisizione della risorsa, ma piuttosto la sua distruzione.

2

La variabile locale viene distrutta quando esce dallo scope. Forse il processo è chiamato come "uscire dal campo di applicazione"?

1

Non sono sicuro che ci sia un nome per questo. Le variabili di stack sono quindi automatico che nessuno si preoccupa di loro, mai, nemmeno abbastanza da dare un nome per questo processo di pulizia automatica.

Chiamarlo "out of scope", credo.

1

Ho sempre sentito parlare come "uscire dall'oscilloscopio" o più precisamente "una variabile auto che esce dall'ambito".

1

Se quello che stai chiedendo è come la chiamata al metodo è effettivamente implementata in codice macchina, direi che dipenderebbe dalla convenzione di chiamata utilizzata

3

Stack svolgimento avviene in entrambi i casi, è solo che in condizioni normali l'esecuzione dello stack viene svolta solo nel contesto del metodo chiamante (o blocco) quando il metodo di esecuzione ritorna (o il blocco viene chiuso). Le variabili locali sono allocate nello stack, quindi vengono ripulite in ordine inverso di allocazione ed è questo processo che viene chiamato unwinding. Non è diverso dall'elaborare qualsiasi altro tipo di dati che memorizzerai in una struttura LIFO - ad es. Annulla Ripristina.

Quando un'eccezione viene lanciata, il gestore disimpegna lo stack attraverso zero o più metodi finché non trova uno che può intercettare l'eccezione o finché non raggiunge la cima dello stack, a quel punto il gestore di eccezioni non gestito sarà chiamato.

Sembra essere convenzione utilizzare solo il termine pila di srotolamento nel caso di gestione delle eccezioni, ma è lo stesso processo che si verifica in ciascuno di questi casi. Il caso specifico in cui lo stack si svolge a causa dell'uscita di un metodo è chiamato return, non sembra esserci alcuna convenzione per nominare cosa succede quando si esce da un blocco di codice con scope.

Problemi correlati