W jednym z plików nagłówkowych Apple'a dla libdispatch
, queue.h
następujące ostrzeżenie pojawia się:C w/bloków: bloki na stosie będzie poza zakresem
// 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.
spróbować, jak mogę, nie mogę wymyślić przypadek testowy, który jest przykładem tego błędu. Mogę tworzyć bloki, które są tworzone na stosie, ale wydają się (wydają się) zawsze pojawiać się na unikatowych adresach na stosie, nawet gdy są poza zasięgiem względem siebie.
Wyobrażam sobie, że odpowiedź na to pytanie jest prosta, ale ucieka mi. Czy ktokolwiek może wypełnić luki w moim (ograniczonym) rozumieniu?
EDIT: Widziałem this odpowiedź, ale ja nie bardzo rozumiem jak to wystąpienie może przełożyć się moim przykładzie zamieszczonych powyżej. Czy ktoś może pokazać mi przykład przy użyciu konstrukcji if
?
Link, który wysłałeś, dotyczy innego problemu, a mianowicie, że zamknięcia wydają się działać dziwnie w obecności zmiennych zmiennych. Zobacz pytanie ["JavaScript: zamknięcie pętli?"] (Http://stackoverflow.com/questions/5555464/javascript-closure-of-loop), który jest dokładnie tym samym problemem w JavaScript. Jednak wygląda na to, że popełnili błąd, o którym wspomina ten komentarz. Czy bloki kopiują się automatycznie w te dni? Chciałbym też wiedzieć. –
Próbowałem trochę, ale zawsze uzyskuję taki sam wynik jak ty, struktury bloków wydają się znajdować w zakresie funkcji. Być może wielu ludzi zostało ugryzionych, a oni to zmienili? –