为何Rust实现的Linked list会触发Stack overflow?
为什么这段Rust链表代码会触发栈溢出?
问题出在链表的递归析构过程,而非链表构建阶段:
- 构建链表时,每次循环都会把旧的链表包装到
Box中(堆分配),最终形成一个嵌套结构:最外层是Cons(999999, Box<Cons(999998, Box<...>)>),一直嵌套到最内层的Empty。这个过程完全在堆上完成,不会占用栈空间。 - 当
main函数执行结束,局部变量list会被自动销毁。Rust对Cons枚举的默认析构逻辑是递归的:销毁Cons(T, Box<Cons<T>>)时,会先销毁存储的T,接着销毁Box指向的下一个Cons节点,这个过程会逐层递归调用析构函数。 - 近百万个节点的递归析构会让调用栈深度达到近百万,而Rust默认的栈大小通常只有几MB(对应几千到几万级别的栈帧),直接超出栈的承载上限,触发栈溢出。
你可以通过跳过递归析构来验证这个结论:在main结尾调用std::mem::forget(list),手动阻止Rust自动销毁链表,程序就能正常运行:
enum Cons<T> { Empty, Cons(T, Box<Cons<T>>), } fn main() { let mut list = Cons::Empty; for i in 1..1_000_000 { list = Cons::Cons(i, Box::new(list)); } std::mem::forget(list); // 跳过递归析构,避免栈溢出 println!("Hello, world!"); }
内容的提问来源于stack exchange,提问作者Test
相关产品推荐
相关产品推荐

