堆栈块寿命

时间:2011-06-28 11:36:53

标签: objective-c stack objective-c-blocks

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 个答案:

答案 0 :(得分:2)

您的代码表现出未定义的行为,因为您正在使用创建它的作用域之外的块。你应该写这个:

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

该变量不会引起问题,因为它实际上已经添加了const限定符复制到块的作用域中。您可以通过使用__block限定符声明变量来赋予对变量的块写访问权限,该限定符具有将变量(即,更改其地址)从堆栈移动到堆的奇怪副作用。引用块被复制。