C言語 確保した動的メモリの解放 - stdlib.h - [ free ]

2008.11.01 Saturday | by LRESULT


的メモリ確保の第四弾、メモリの解放を行うには、free()を使います。

※ 第一弾 malloc()は、こちら
※ 第二弾 calloc()は、こちら
※ 第三弾 realloc()は、こちら

この free()は、動的メモリ領域の確保を行うための、
malloc()、calloc()、realloc()という関数と必ずセットで使用します。

動的メモリの解放を忘れて、新たに領域を確保してしまったりしていくと、
どんどん使用されない領域が増えてしまい、メモリ領域を食い潰してしまいます。
メモリ領域の解放忘れのことを「メモリリーク」と言います。


free
書式 void free( void *ptr )
機能 確保した動的メモリ領域の解放
引数 void *ptr : malloc()などで確保したメモリ領域のポインタ
戻り値 なし





サンプルコード
動的メモリを malloc()で確保し、そのアドレスを確認してみます。
その後、free()で領域を解放し、もう一度アドレスを確認してみます。

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
  char *mbuf = NULL;
  int sz;

  sz = 20 * sizeof( char );
  mbuf = (char *)malloc( sz );
  if( mbuf == NULL ){
    printf( "メモリ確保に失敗しました¥n" );
    return -1;
  }

  printf( "%p¥n", mbuf );

  free( mbuf );
  printf( "%p¥n", mbuf );

  return 0;
}




結果
003A2FC0
003A2FC0
環境や確保する領域によって、アドレスに違いはありますが、
このように表示されます。

つまり、free()を実行しても、
確保した領域は解放されるが、アドレスはNULLになっているわけでは無いという事です。
( これもOSによっては、NULLが入る事もありますが。 )

というわけで、実際には解放されているのに、
NULLチェックをすり抜けてしまう場合がある為、
free()の後には、mbuf = NULL; というようにNULLを入れましょうという話。

カテゴリ:C言語 stdlib.h | 19:24 | comments(2) | trackbacks(0) | -


コメント

( これもOSによっては、NULLが入る事もありますが。 )

絶対にありえません。
free関数に対して値渡しを行っているため、mbufが書き換わることはありえません。

| hiro_knigh | 2012/04/25 5:43 PM |

コメント

( これもOSによっては、NULLが入る事もありますが。 )
OS云々ではなく、c言語の仕様でNULLが入る事がありません。
というより出来ません。
※FREE関数にはアドレスを値渡ししているため。

| hiro_knigh | 2012/04/26 10:03 AM |

コメントする











この記事のトラックバックURL

http://simd.jugem.jp/trackback/100

トラックバック