Срок службы блока стека - PullRequest
2 голосов
/ 28 июня 2011
int (^b[3])();
for (int i=0; i<3; i++)
    b[i] = ^{ return i;};
for (int i=0; i<3; i++)
    printf("b %d\n", b[i]());

В первом цикле создается блочная структура, затем адрес этой структуры присваивается элементу b [i], а затем блочная структура уничтожается. Вопрос в том, почему b [i] во втором цикле содержит действительные / одинаковые указатели на последнее состояние блока? Я ожидаю, что второй цикл завершится сбоем, потому что элементы указывают на недопустимую область стека.

Я знаю, что это не лучший кусок кода, и я им не пользуюсь. Но хочу понять, почему после первого цикла, когда блочная структура должна быть разрушена, у меня есть действующий объект стека.

1 Ответ

2 голосов
/ 28 июня 2011

Ваш код демонстрирует неопределенное поведение, так как вы используете блок вне области, в которой он был создан. Вы должны написать это вместо:

b[i] = [^{ return i; } copy];

Переменная не вызовет проблемы, потому что она фактически копируется в область видимости блока с добавленным квалификатором const. Вы можете дать блоку доступ на запись в переменную, объявив переменную с квалификатором __block, что имеет странный побочный эффект перемещения переменной (т. Е. Изменения ее адреса) из стека в кучу при обращении к блоку ссылок копируется.

...