В одном из заголовочных файлов 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
конструкций?