メモリ開放を行います。
[所属]
標準ライブラリ
[指定形式]
#include <stdlib.h>
void free(void *ptr);
[詳細説明]
ptrが指す領域を開放し,その後の割り付けに使用できるようにします。ptrには,calloc,malloc,およびreallocで獲得した領域を指定しなければなりません。
[使用例]
#include <stdlib.h>
typedef struct {
double d[3];
int i[2];
} s_data;
int func(void) {
s_data *buf;
if((buf = calloc(40, sizeof(s_data))) == NULL) /*s_data40個のための領域を割り付け*/
return(1);
free(buf); /*領域を開放*/
return(0);
}
|
セキュリティ機能用ライブラリを使用する場合,次の操作を行った場合に__heap_chk_fail関数を呼び出します。
- | freeで開放した後のポインタを再度free,reallocに渡す。 |
__heap_chk_fail関数はユーザが定義する必要があり,動的メモリ管理の異常時に実行する処理を記述します。
__heap_chk_fail関数を定義する際には,次の項目に注意してください。
- | 返却値の型はvoid型のみであり,仮引数を持たない関数です。 |
- | __heap_chk_fail 関数内で再帰的にヒープ・メモリ領域の破壊を検出しないように注意してください。 |
セキュリティ機能用のcalloc,malloc,およびreallocは,領域外への書き込みを検出するために前後4バイト余分に領域を割り当てます。このため,通常より多くヒープ・メモリ領域を消費します。
#include <stdlib.h>
void sub(int *ip) {
...
free(ip);
}
int func(void) {
int *ip;
if ((ip = malloc(40 * sizeof(int))) == NULL)
if ((ip = malloc(10 * sizeof(int))) == NULL) return(1);
else sub(ip); /* 1 回目のfree */
else
...
free(ip); /* 2 回目のfree */
return(0);
}
void __heap_chk_fail(void) {
/* ヒープ・メモリ領域破壊を検出したときの処理 */
}
|