我已经编写了一个二进制树状结构,但是在某些压力测试中却遇到了堆栈溢出错误。我已将引起错误的代码减少到以下内容: 结构节点{ 索引:usize, 右:Option>, }
struct BoxedTree {
root: Option<Box<Node>>,
}
fn build_degenerate() {
let mut t = BoxedTree {
root: Some(Box::new(Node {
index: 0,
right: None,
})),
};
let mut n = t.root.as_mut().unwrap();
for i in 1..50000 {
let cur = n;
let p = &mut cur.right;
*p = Some(Box::new(Node {
index: i,
right: None,
}));
n = p.as_mut().unwrap();
}
println!("{}", n.index);
}
fn main() {
build_degenerate();
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn mytest() {
build_degenerate();
}
}
跑步cargo test
给我:
running 1 test
thread 'tests::mytest' has overflowed its stack
fatal runtime error: stack overflow
error: process didn't exit successfully: ...
由于所有数据似乎都分配在堆上,并且没有递归,因此我不理解这段代码是如何导致堆栈溢出的。
即使是陌生人,即使cargo test
和cargo run
调用相同的代码,该代码也会在我运行mytest
时导致溢出,而在我运行main
时不会导致溢出。 / p>
这是怎么了?