You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 03:22:47