Everything

free


メモリ開放を行います。

[所属]

標準ライブラリ

[指定形式]

#include <stdlib.h>

void free(void *ptr);

[詳細説明]

ptrが指す領域を開放し,その後の割り付けに使用できるようにします。ptrには,callocmalloc,および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関数を呼び出します。

-

callocmallocreallocで確保した領域以外のポインタをfree,reallocに渡す。

-

freeで開放した後のポインタを再度free,reallocに渡す。

-

callocmallocreallocで割り当てた領域の外側(前後それぞれ4バイト以内)に何らかの値を書き込んだ後,割り当てた領域を指すポインタをfree,reallocに渡す。

__heap_chk_fail関数はユーザが定義する必要があり,動的メモリ管理の異常時に実行する処理を記述します。

__heap_chk_fail関数を定義する際には,次の項目に注意してください。

-

返却値の型はvoid型のみであり,仮引数を持たない関数です。

-

static指定をしないでください。

-

__heap_chk_fail 関数内で再帰的にヒープ・メモリ領域の破壊を検出しないように注意してください。

-

__heap_chk_fail関数を,PIC(「8.6 PIC/PID機能」を参照してください)対象としないでください。

セキュリティ機能用のcallocmalloc,および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) {
    /* ヒープ・メモリ領域破壊を検出したときの処理 */
}