В одном из заголовочных файлов Apple для libdispatch
, queue.h
появляется следующее предупреждение:
// 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.
Попробуйте, как я могу, я не могу придумать тестовый пример, который бы иллюстрировал эту ошибку. Я могу создавать блоки, которые инстанцируются на стеке, но они (кажется) всегда появляются по уникальным адресам на стеке, даже если они находятся вне пределов видимости по отношению друг к другу.
Я представляю, что ответ на этот вопрос прост, но он ускользает от меня. Может ли кто-нибудь заполнить пробелы в моем (ограниченном) понимании?
ОТРЕДАКТИРУЙТЕ : Я видел этот ответ, но я не совсем понимаю, как этот экземпляр может перевести на мой пример, размещенный выше. Кто-нибудь может показать мне пример, используя if
constructs?