9
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Rustで巨大なヒープメモリを取る

Last updated at Posted at 2017-08-07

4MBのヒープメモリを取ることに手こずったのでメモ。

Boxを使う方法

fn main() {
    let buf=Box::new([0;1024*1024*4]);
    println!("addr:{:?}",buf[1]);
}

こんなエラーが出て死ぬ

thread 'main' has overflowed its stack

なーんでヒープ使うのにスタックオーバーフローで死んでんだよ。
ヒープ確保してるだけじゃん、mallocだろ???????????
とか思ったけど、よくよく調べてみると次の手順で初期化しているらしい。

  1. スタックに領域確保&初期化
  2. 確保したヒープメモリにコピー

素直にヒープ領域を初期化しろよ
とか思ったけど、何か理由があってそうしてるんだと思う。しらんけど。

なので、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);
}

おわり

9
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?