在玩 Swift 时,我遇到了崩溃的情况,但我仍然不明白为什么。
让我们定义:
class TestClass {
var iteration: Int = 0
func tick() -> Void{
if iteration > 100000 {
print("Done!")
return
}
iteration++
tick()
}
}
The tick()
函数调用自身并且每次递增iteration
。任何类型的调用
let test = TestClass()
test.tick()
makes the program crash after a rather small number of recursions (around 50000 on my iMac), with a EXC_BAD_ACCESS
error:
如果我定义一个类似的struct
代替class
,没有崩溃(至少在这些限制内)。请注意,当程序崩溃时,程序仅使用几 MB 的 RAM。
我还无法解释为什么会崩溃。有人有解释吗?这callbackStorage
值似乎很可疑,但我还没有找到任何关于此的指针。
在你的程序中,每个线程都有一个叫做stack。堆栈是一种 LIFO(后进先出)——一种具有 2 个主要操作的数据容器:push,将一个元素添加到堆栈顶部,并且pop,从堆栈顶部删除一个项目。
当你的程序调用一个函数时,它会推送调用该函数的代码的位置,称为退货地址,(有时还有函数的一些参数),然后跳转到该函数的代码。 (函数的局部变量也存储在堆栈中。)当函数返回时,它将返回地址从堆栈中弹出并跳转到该地址。
然而,堆栈的大小是有限的。在您的示例中,您的函数调用自身多次,以至于堆栈中没有足够的空间来容纳所有返回地址、参数和局部变量。这被称为堆栈溢出 https://en.wikipedia.org/wiki/Stack_overflow(这就是该网站名称的由来)。程序试图写入超出堆栈末尾的内容,从而导致segfault https://en.wikipedia.org/wiki/Segfault.
使用 a 时程序不会崩溃的原因struct
可能,正如 dans3itz 所说 https://stackoverflow.com/a/30876643/3476191,因为类比结构有更多的开销。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)