名 前
__malloc_hook, __malloc_initialize_hook, __memalign_hook, __free_hook, __realloc_hook, __after_morecore_hook − malloc デ バ ッ グ 用 の 変 数
書 式
#include <malloc.h>
void *(*__malloc_hook)(size_t size, const void *caller);
void *(*__realloc_hook)(void *ptr, size_t size, const void *caller);
void
*(*__memalign_hook)(size_t alignment,
size_t size,
const void *caller);
void (*__free_hook)(void *ptr, const void *caller);
void (*__malloc_initialize_hook)(void);
void (*__after_morecore_hook)(void);
説 明
GNU C ラ イ ブ ラ リ で は 、 適 切 な フ ッ ク 関 数 (hook function) を 指 定 す る こ と で malloc(3), realloc(3), free(3) の 動 作 を 変 更 す る こ と が で き る 。 例 え ば 、 動 的 に メ モ リ ー 割 り 当 て を 行 う プ ロ グ ラ ム の デ バ ッ グ に こ れ ら の フ ッ ク を 使 う こ と が で き る 。 変 数 __malloc_initialize_hook は malloc の 実 装 が 初 期 化 さ れ る 際 に 一 度 だ け 呼 ば れ る 関 数 へ の ポ イ ン タ ー で あ る 。 こ の 変 数 は 書 き 換 え 可 能 (weak) で あ り 、 ア プ リ ケ ー シ ョ ン 内 で 以 下 の よ う な 定 義 で 上 書 き で き る :
void (*__malloc_initialize_hook)(void) = my_init_hook; な お 、 関 数 my_init_hook() で 全 て の フ ッ ク の 初 期 化 を す る こ と が で き る 。
__malloc_hook, __realloc_hook, __memalign_hook, __free_hook で 指 さ れ る 4 つ の 関 数 は 、 各 々 malloc(3), realloc(3), memalign(3), free(3) と よ く 似 た プ ロ ト タ イ プ を 持 っ て い る が 、 一 番 最 後 の 引 き 数 caller を と る 点 が 異 な る 。 引 き 数 caller に は 、 malloc(3) な ど の 呼 び 出 し 元 (caller) の ア ド レ ス が 格 納 さ れ る 。 変 数 __after_morecore_hook は 、 領 域 の 追 加 要 求 が あ り sbrk(2) が 呼 ば れ た 後 で 毎 回 呼 び 出 さ れ る 関 数 へ の ポ イ ン タ ー で あ る 。
準 拠
こ れ ら の 関 数 は GNU に よ る 拡 張 で あ る 。
注 意
マ ル チ ス レ ッ ド プ ロ グ ラ ム で は 、 こ れ ら の フ ッ ク 関 数 の 使 用 は 安 全 で は な く 、 今 で は 非 推 奨 で あ る 。 プ ロ グ ラ マ は 、 "malloc" や "free" の よ う な 関 数 を 定 義 し て 公 開 し て 、 関 連 す る 関 数 を 呼 び 出 す よ う に す べ き で あ る 。
例
こ れ ら の 変 数 の 使 い 方 の 簡 単 な 例 を 以 下 に 示 す 。
#include
<stdio.h>
#include <malloc.h>
/* 使
お う と す る フ
ッ ク の プ ロ ト
タ イ プ 宣 言 */
static void my_init_hook(void);
static void *my_malloc_hook(size_t, const void *);
/* 元
々 の フ ッ ク を
保 存 す る た め
の 変 数 */
static void *(*old_malloc_hook)(size_t, const void *);
/* C ラ
イ ブ ラ リ か ら
呼 ば れ る 初 期
化 フ ッ ク を 上
書 き す る */
void (*__malloc_initialize_hook) (void) = my_init_hook;
static void
my_init_hook(void)
{
old_malloc_hook = __malloc_hook;
__malloc_hook = my_malloc_hook; }
static void *
my_malloc_hook(size_t size, const void *caller)
{
void *result;
/* 元
々 の フ ッ ク を
全 て 戻 す */
__malloc_hook = old_malloc_hook;
/* malloc
の 再 帰 的 呼 び
出 し */
result = malloc(size);
/* 現
在 設 定 さ れ て
い る フ ッ ク (underlying
hook) を 保 存 す る */
old_malloc_hook = __malloc_hook;
/* printf()
は malloc() を 呼 び 出
す 可 能 性 が あ
る の で こ こ で
も ガ ー ド を 行
う
(元 々 の フ ッ ク
の ま ま に し て
お く ) */
printf("malloc(%u) called from %p returns %p\n",
(unsigned int) size, caller, result);
/* ユ
ー ザ ー が 使 お
う と す る フ ッ
ク を 再 設 定 す
る */
__malloc_hook = my_malloc_hook;
return result; }
関 連 項 目
mallinfo(3), malloc(3), mcheck(3), mtrace(3)
こ の 文 書 に つ い て
こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。