4MBのヒープメモリを取ることに手こずったのでメモ。
Boxを使う方法
fn main() {
let buf=Box::new([0;1024*1024*4]);
println!("addr:{:?}",buf[1]);
}
こんなエラーが出て死ぬ
thread 'main' has overflowed its stack
なーんでヒープ使うのにスタックオーバーフローで死んでんだよ。
ヒープ確保してるだけじゃん、mallocだろ???????????
とか思ったけど、よくよく調べてみると次の手順で初期化しているらしい。
- スタックに領域確保&初期化
- 確保したヒープメモリにコピー
素直にヒープ領域を初期化しろよ
とか思ったけど、何か理由があってそうしてるんだと思う。しらんけど。
なので、Vecを使う。
fn main() {
let mut buf :Vec<u8>= vec![0;1024*1024*4];
println!("Hello, world!{:?}",buf);
}
未初期化の領域が欲しかったら以下のように。
ただし、メモリを確保して、ベクタの管理情報を自分で登録する
というように、あまりにもC言語的なミスが発生しやすそうなので使いたくない。
ぶっちゃけ自分で0-fillするので、上の例だけで十分っぽい。
fn main() {
let mut buf ;
unsafe{
let len=1024*1024*4;
buf=Vec::<u8>::with_capacity(len);
buf.set_len(len);
}
println!("buf:{:?}",buf);
}
おわり