動的メモリ確保とは

どうてきめもりかくほ

プログラムの実行中に、必要な大きさのメモリを確保し、使い終わったら解放すること。C言語では malloc(大きさ) で確保して先頭の番地を受け取り、free(番地) で解放する。calloc は0で初期化した領域を、realloc は大きさを変えた領域を返す。確保に失敗すると NULL が返るので確かめる必要がある。領域はヒープに置かれ、解放するまで関数から戻っても残る。小さなマイコンでは、断片化や確保にかかる時間が予測しにくいため避けることが多い。

「動的メモリ確保」は、4分野の7問の練習問題に出てきます(C言語の基礎, リンカ・ローダと実行形式, 組込み・ファームウェアなど)。

この用語の分野: C言語の基礎

動的メモリ確保の練習問題に挑戦

C言語のmallocで確保したメモリは、一般にプロセスのどの領域から取られるか。

  1. A.textセクション
  2. Bヒープ
  3. C.rodataセクション
答えと解説を見る

正解:B. ヒープ

ヒープは、プログラムの実行中に必要な大きさのメモリを確保し、不要になったらfreeで返す領域です。確保する大きさや寿命を実行時に決められるのが特徴です。mallocは自分で空き領域を管理し、足りなくなるとOSに頼んで領域を広げます(Linuxではbrkやmmapのシステムコール)。freeし忘れると、使わないメモリが残り続けるメモリリークになります。

mallocとfreeを繰り返すうちに、空きメモリの合計は十分あるのに、大きな領域をまとめて確保できなくなることがある。この現象を何と呼ぶか。

  1. Aメモリリーク
  2. B断片化(フラグメンテーション)
  3. Cスタックオーバーフロー
答えと解説を見る

正解:B. 断片化(フラグメンテーション)

大きさの違う領域の確保と解放を繰り返すと、使用中の領域の間に小さな空きが散らばります。空きの合計は大きくても、つながった大きな空きがないと大きな確保に失敗します。これを断片化と呼びます。メモリの割り当て器は、大きさごとに分けて管理したり、隣り合う空きをまとめたりして断片化を減らします。長く動き続ける組込み機器では特に注意が必要です。

解説の中の「動的メモリ確保」

「動的メモリ確保」が出てくる問題(7問)

  1. C言語のmallocで確保したメモリは、一般にプロセスのどの領域から取られるか。
  2. mallocとfreeを繰り返すうちに、空きメモリの合計は十分あるのに、大きな領域をまとめて確保できなくなることがある。この現象を何と呼ぶか。
  3. 小さなマイコンのファームウェアで、mallocなどの動的なメモリの確保を避けることが多い理由として正しいものはどれか。
  4. C言語で、(1) 関数の中で static を付けずに宣言した局所変数、(2) malloc で確保した領域、(3) 関数の外で宣言した変数、のそれぞれが存在する期間(寿命)の組み合わせとして正しいものはどれか。
  5. LinuxのNUMAシステムでよく使われるファーストタッチの方針(初めてページに書き込んだスレッドが動いているノードのメモリにそのページを置く)で注意すべき点として正しいものはどれか。
  6. fill と use は別に定義された関数とする。上の関数の問題点として、正しいものはどれか。
  7. 上の関数 make が返すポインタについて、正しいものはどれか。

C言語の基礎の参考書を探す PR

Amazonの検索結果へのリンクです。Amazonのアソシエイトとして、半導体教室は適格販売により収入を得ています。

関連する用語

ヒープ メモリリーク 変数 スタック ポインタ システムコール 断片化 マイコン(マイクロコントローラ) NUMA ページフォルト

用語集の一覧へ