【问题标题】:Stack overflow with heap buffer?堆缓冲区的堆栈溢出?
【发布时间】:2017-02-23 10:58:13
【问题描述】:

我有以下代码要从文件中读取:

let mut buf: Box<[u8]> = Box::new([0; 1024 * 1024]);
while let Ok(n) = f.read(&mut buf) {
    if n > 0 {
        resp.send_data(&buf[0..n]);
    } else {
        break;
    }
}

但它会导致:

fatal runtime error: stack overflow

我在 OS X 10.11 上使用 Rust 1.12.0。

【问题讨论】:

  • 在这种情况下f 是什么?
  • 这是一个 mio::tcp::TcpStream
  • 你的堆栈的默认大小是多少?因为Box::new([0; 1024 * 1024]) 将在堆栈上分配 1MB,然后再将其移动到框。
  • @ElefEnt:正在开发中 (placement_new_protocol)。同时,我建议创建一个Vec,然后通过into_boxed_slice 将其转换为Box
  • 对于这种特殊情况,使用 Vec 或 Box 无关紧要,因此您也可以只使用 Vec 而不是转换。

标签: rust


【解决方案1】:

正如 Matthieu 所说,Box::new([0; 1024 * 1024]) 当前会由于初始堆栈分配而溢出堆栈。如果您使用 Rust Nightly,box_syntax 功能将允许它正常运行:

#![feature(box_syntax)]

fn main() {
    let mut buf: Box<[u8]> = box [0; 1024 * 1024]; // note box instead of Box::new()

    println!("{}", buf[0]);
}

您可以在以下问题中找到有关boxBox::new() 之间区别的更多信息:What the difference is between using the box keyword and Box::new?

【讨论】:

  • 真的会溢出栈吗?我的意思是,它只有 1MB,这不算多。我知道一些操作系统默认有严格的限制,但我不知道 OS X 是否是其中之一。
  • 嗯,就是报错了;也许这是假的,但我不知道如何进一步调查。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-20
  • 2015-07-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多