【C言語入門】freeの使い方

こんにちは、もがちゃんです。

C言語でmalloc等を使用してメモリ領域を確保した際、メモリに確保した領域を解放するために使用するのがfreeになります。
これは、fopenとfcloseのような関係ですね。

今回は、このfreeの使い方について簡単なサンプルソースとともに説明します。

freeの構文

#include <stdlib.h>
void free(void *ptr);

freeの説明

ptrで指定されたポインタが指す領域を解放します。ptrがNULLポインタの場合は何もしません。

free関数は、ptrが指す領域を解放し、その後の割付けに使用できるようにする。ptrが空ポインタの場合、何もしない。それ以外の場合、実引数がcalloc関数、malloc関数若しくはrealloc関数によって以前に返されたポインタと一致しないとき、又はその領域がfree若しくはreallocの呼出しによって解放されているとき、その動作は未定義とする。

JISX3010 プログラム言語C
ptr

解放したいメモリ領域の先頭を指すポインタ(malloc関数、calloc関数、realloc関数の返却値)を指定します。

freeの使い方サンプル

サンプルソースと実行結果
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char* argv[]) {

  void *p = NULL;

  fprintf(stdout, "p[%p]\n", p);
  free(p);
  fprintf(stdout, "execute free(%p);\n", p);

  p = malloc((size_t)32*1024*1024);
  fprintf(stdout, "p[%p]\n", p);
  free(p);
  fprintf(stdout, "execute free(%p);\n", p);

}
freeの使い方サンプルの実行結果
freeの使い方サンプルの実行結果

NULLポインタを指定してfreeを実行しても何もしないので、プログラムが異常終了することはないですね。

freeをしないとどうなるか

freeでメモリ領域の解放を行わず、ずっとmallocでメモリ領域の確保のみ行い続けた場合にどうなるか以下のソースで試してみます。

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

void testMalloc();
int main(int argc, char* argv[]) {
  for(long i = 0; ; i++) {
    testMalloc();
    fprintf(stdout, "[%ld]\n", i);
  }
}

void testMalloc() {
  /* 32Mbyte malloc */
  void *p = malloc((size_t)32*1024*1024);
  fprintf(stdout, "p[%p]\t", p);
}

このテストプログラムを実行する前の状態は、以下の通り。

freeをしないとどうなるかの確認プログラム実行前状態
freeをしないとどうなるかの確認プログラム実行前状態

このテストプログラム実行中の状態は、以下の通り。

freeをしないとどうなるかの確認プログラム実行中状態
freeをしないとどうなるかの確認プログラム実行中状態

当然ながらメモリ使用率がどんどん上昇して行ってます。

そのままこのテストプログラムを実行しているとプログラムの実行が強制終了してしまいました。このテストプログラムを実行した環境は、Play with Docker上なので、Windows10上であれば結果が変わるかもしれません、プログラムが強制終了しないとしてもmallocが失敗してmallocの返却値がNULLポインタになるでしょう。

freeをしないとどうなるかの確認プログラムが最終的には強制終了
freeをしないとどうなるかの確認プログラムが最終的には強制終了

freeのまとめ

free関数は、malloc関数、calloc関数、realloc関数などとセットで使用する関数です。

malloc関数、calloc関数、realloc関数などでメモリ領域を獲得後、そのメモリ領域が不要になった場合は、必ずfree関数でメモリ領域を解放する。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA