ホーム » スタッフ » 斉藤徹 » 講義録 » 情報構造論 » malloc/freeの使い方

2009年5月
« 4月   6月 »
 12
3456789
10111213141516
17181920212223
24252627282930
31  

最近の投稿(電子情報)

アーカイブ

カテゴリー

malloc/freeの使い方

メモリー利用の問題点として、C言語の固定配列サイズの 問題点を紹介し、その対応として、malloc/freeを紹介。

たとえば、複数の名前を配列に記憶する場合、

char name[ 100 ][ 20 ] ;

では、平均名前長が8文字ぐらいだと、12文字/件の無駄が 発生するし、ジュゲムのような長い名前は覚えられない。

そこで、その対応として、

char heap[ 2000 ] ;
char* name[ 100 ] ;

として、

               ↓name[1]      ↓name[3]
heap: t-saitoh$tomoko$mitsuki$jugemujyugemu......$ayuka$
      ↑name[0]       ↑name[2]

といった、最初に巨大配列を一括して確保しておき、 データに応じて細切れにして使う手法を説明する。 こうすれば、メモリ空間は「詰めて」保存ができ、 無駄が排除できる。 でも、この領域で、途中途中のデータが不要になったら、 その隙間の管理は面倒。

malloc/free

そこで、malloc/free はこれらをうまく活用してくれる。

int size ; //サイズが入っているとする。
int* p ;
// size*sizeof(int) byte のメモリを確保。
// その先頭アドレスを返してくれる。
// 型キャストののち、p に代入。
p = (int*)malloc( size * sizeof( int ) ) ;
// 処理後に領域が不要になったら、freeで解放。
// 必要に応じて再利用してくれる。
free( p ) ;

ただし、通常は、malloc はメモリ確保時に、NULL を返すので、 if でチェックの必要がある。一般的な使い方は、

int size ;
int* array ;
scanf( "%d" , &size ) ;
array = (int*)malloc( size * sizeof( int ) ) ;
if ( array != NULL ) {
   for( int i = 0 ; i < size ; i++ )
      scanf( "%d" , &array[ i ] ) ;
   :
   free( array ) ;
}

ただし、free を忘れると、メモリリークが発生し、メモリの無駄な利用は、 仮想記憶の利用から、補助記憶への読み書きを発生させ、処理速度低下を 招くかもしれない。その他の内容は、以下の通り。

  • 終了直前のfreeならなくてもよい。
  • ネットワークプログラミングでは、子プロセス終了時に自動解放がよく使われる。
  • スタック領域を使うんなら、alloca() という関数もある。
  • C++なら new / delete 演算子を使う。
  • ガベージコレクタのある処理系(java/C#)なら、freeは不要…