En uno de los archivos de cabecera de Apple para libdispatch
, queue.h
, aparece la siguiente advertencia:C w/Blocks: bloques basado en pila de salir del alcance
// 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.
mas que trate, no puede llegar a una caso de prueba que ejemplifica este error. Puedo crear bloques que se crean instancias en la pila, pero (parece) siempre aparecen en direcciones únicas en la pila, incluso cuando están fuera del alcance con respecto a la otra.
Imagino que la respuesta a esto es simple, pero se me escapa. ¿Alguien puede llenar los vacíos en mi (limitado) entendimiento?
EDIT: He visto this respuesta, pero no entiendo muy bien cómo esa instancia se puede traducir a mi ejemplo publicado anteriormente. ¿Alguien puede mostrarme un ejemplo usando construcciones if
?
El enlace que ha publicado tiene que ver con un problema diferente, es decir, que los cierres parecen actuar de manera extraña en presencia de variables variables. Consulte la pregunta ["Javascript: ¿cierre del ciclo?"] (Http://stackoverflow.com/questions/5555464/javascript-closure-of-loop), que es exactamente el mismo problema en JavaScript. Sin embargo, parece que cometieron el error advertido por este comentario. ¿Los bloques se copian automáticamente en estos días? Me gustaría saber, también. –
Lo he intentado un poco, pero siempre obtengo el mismo resultado que usted, las estructuras de bloques parecen estar en el alcance de la función. Tal vez mucha gente fue mordida y lo cambiaron así? –