Manpages

名 前

__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/ に 書 か れ て い る 。