2016-10-14 4 views
4

は、私は、ファイルから読み込むには、次のコードを持っている:スタックオーバーフローとヒープバッファー?

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 

私は錆1.12.0とOS X 10.11にしています。

+0

この場合、 'f'とは何ですか? – squiguy

+0

mio :: tcp :: TcpStream – ElefEnt

+0

コードがクラッシュしたときのnの値は何ですか? – Fabulous

答えて

5

Matthieu氏によると、Box::new([0; 1024 * 1024])は現在、最初のスタック割り当てのためにスタックをあふれてしまいます。あなたが錆夜間を使用している場合は、box_syntax特徴は、それが問題なく実行できるようになります:What the difference is between using the box keyword and Box::new?

#![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()の違いについての追加情報を見つけることができます。

+1

スタックが実際にオーバーフローしますか?つまり、それは1MBだけで、それほど多くはありません。私はいくつかのOSがデフォルトできつく制限されていることを知っていますが、OS Xがその1つであるかどうかはわかりません。 –

+0

これは報告されているエラーです。おそらくそれは偽装ですが、それをさらに調査する方法はわかりません。 – ljedrz

関連する問題