In uno dei file di intestazione di Apple per libdispatch
, queue.h
, compare il seguente avviso:C w/Blocks: blocchi stack-based uscendo dal suo ambito
// The declaration of a block allocates storage on the stack.
// Therefore, this is an invalid construct:
dispatch_block_t block;
if (x) {
block = ^{ printf("true\n"); };
} else {
block = ^{ printf("false\n"); };
}
block(); // unsafe!!!
// What is happening behind the scenes:
if (x) {
struct Block __tmp_1 = ...; // setup details
block = &__tmp_1;
} else {
struct Block __tmp_2 = ...; // setup details
block = &__tmp_2;
}
// As the example demonstrates, the address of a stack variable is
// escaping the scope in which it is allocated. That is a classic C bug.
provare come posso, non riesco a trovare una test case che esemplifica questo bug. Posso creare blocchi che vengono istanziati nello stack, ma sembrano (sembrano) sempre a indirizzi univoci nello stack, anche quando sono fuori portata rispetto l'uno all'altro.
Immagino che la risposta a questo sia semplice, ma mi sfugge. Qualcuno può colmare le lacune nella mia (limitata) comprensione?
EDIT: ho visto la risposta this, ma non capisco bene come quell'istanza possa tradurre nel mio esempio pubblicato sopra. Qualcuno può mostrarmi un esempio usando i costrutti if
?
Il link che hai postato ha a che fare con un problema diverso, vale a dire che le chiusure sembrano comportarsi in modo strano in presenza di variabili mutabili. Vedi la domanda ["Javascript: chiusura del ciclo?"] (Http://stackoverflow.com/questions/5555464/javascript-closure-of-loop), che è esattamente lo stesso problema in JavaScript. Tuttavia, sembra che abbiano fatto l'errore messo in guardia da questo commento. I blocchi si copiano automaticamente in questi giorni? Mi piacerebbe saperlo anche io. –
Ho provato un po 'ma ottengo sempre lo stesso risultato, le strutture dei blocchi sembrano essere allo scopo della funzione. Forse un sacco di persone sono state morse e loro l'hanno cambiato così? –