我有一个使用递归的Rust程序.有时它会遇到"堆栈溢出"运行时错误.我想阻止这种情况的发生.相反,我希望在我的递归函数中有如下内容:

fn foo() -> u32 {
  if stack_is_almost_full() {
    panic!("Something is wrong with the recursion!");
  }
  // continue normally
}

有可能吗?

推荐答案

您可以从stacker::remaining_stack得到剩余堆栈空间的估计值.

但是,对于检测递归问题,一些更直接的方法可能更合适:

const MAX_DEPTH: usize = 1024;
#[inline(always)]
fn foo() -> u32 {
    foo_rec(0).expect("MAX_DEPTH reached while recursing")
}

fn foo_rec(depth: usize) -> Option<u32> {
    if depth > MAX_DEPTH {
        None
    }
    // do your work possibly recursing, finally return something
    if should_recurse() {
        foo_rec(depth + 1)
    } else {
        Some(42)
    }
}

fn should_recurse() -> bool {
    true // uh-oh
}

Rust相关问答推荐

有没有方法处理rust中嵌套的ok_or()?

Rust中的相互递归特性与默认实现

什么时候铁 rust FFI边界上的panic 是未定义的行为?

从Type::new()调用函数

如何删除Mac Tauri上的停靠图标?

在Rust中是否可以使用Rc自动化约束传播

对于rustc编译的RISC-V32IM二进制文件,llvm objdump没有输出

如何使用reqwest进行异步请求?

如何轮询 Pin>?

Rust proc_macro 和 syn:解析空格

如何执行数组文字的编译时串联?

结果流到 Vec 的结果:如何避免多个into_iter和collect?

Rust 如何将链表推到前面?

在1.5n次比较中找到整数向量中的最大和次大整数

Rust 打包在 .deb 中

如何将切片推入数组?

在 Rust 中退出进程

类型组的通用枚举

为什么我可以从读取的可变自引用中移出?

在特征中返回一个 Self 类型的值