こんにちは、もがちゃんです。
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
解放したいメモリ領域の先頭を指すポインタ(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);
}

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);
}
このテストプログラムを実行する前の状態は、以下の通り。

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

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

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