2016-10-14 2 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 

내가 OS X 10.11에 녹 1.12.0와 함께.

+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가 그 중 하나인지는 알 수 없습니다. –

+0

글쎄, 그건보고 된 오류입니다; 어쩌면 가짜지만, 더 자세히 조사 할 방법을 모르겠습니다. – ljedrz