Utilizzo delle variabili non locali catturate nelle chiusure C ++

3

Su questa pagina di wikipedia ho trovato la seguente frase riguardante le chiusure in C ++ 11:

C++11 closures can capture non-local variables by copy or by reference, but without extending their lifetime.

Ciò significa che una chiusura esistente potrebbe riferirsi a una variabile non locale che è già stata disallineata? In tal caso, c'è qualche cura speciale / best practice che si deve seguire quando si usano variabili non locali catturate all'interno di una chiusura C ++?

    
posta Giorgio 16.08.2012 - 22:16
fonte

1 risposta

4

Does this mean that an existing closure might refer to a non-local variable that has already been de-allocated?

Sì. Estendere il tempo di vita di un oggetto che è stato assegnato alla pila oltre l'esecuzione della funzione esterna sembra essere da qualche parte tra irragionevole e impossibile. Inoltre, il compilatore non tenterà di verificare se tale estensione è necessaria e di allocare magicamente l'oggetto sull'heap o qualcosa del genere. Come programmatore devi essere esplicito su ciò che dovrebbe accadere in relazione all'assegnazione. Se si desidera utilizzare il negozio gratuito (aka heap), utilizzare il negozio gratuito. Non c'è nulla di magico in corso con lambda. Se fai in modo che l'oggetto di chiusura memorizzi l'indirizzo di qualche altro oggetto che era solito vivere nello stack e provi ad accedervi dopo che è scomparso, il comportamento non è definito.

any special care / best practice that one has to follow when using captured non-local variables inside a C++ closure?

Assicurati che il tuo lambda non acquisisca per riferimento se l'oggetto lambda (o una sua copia) sopravvive rispetto all'ambito in cui è stato creato (o l'originale). Ad esempio, usando un lambda che cattura per riferimento come argomento ad alcuni degli algoritmi che trovi nell'intestazione dell'algoritmo va perfettamente bene.

    
risposta data 16.08.2012 - 23:04
fonte

Leggi altre domande sui tag