Во время попытки доказать одному товарищу, что Swift — ненужно, я наткнулся на интересную особенность:
import Foundation
let noLeak = 131028
let withLeak = noLeak*10
class R {
var _a : R?
init(a : R?) {
_a = a
}
}
func test(n:Int, leak:Bool) {
var p0 = R(a : nil)
var p = R(a : p0)
for _ in 1...n {
p = R(a : p)
}
if leak {
p0._a = p
}
}
test(withLeak, true)
println("Evil leaking function")
test(noLeak, false)
println("Good function")
Первый вызов test просто течёт в лучших традициях Reference Counting, а вот второй падает со stack overflow (деаллокация, похоже, делается рекуррентно).
Интересно, есть ли такое же в Rust?