__malloc_hook, __malloc_initialize_hook, __memalign_hook, __free_hook, __realloc_hook, __after_morecore_hook − malloc debugging variables


#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 *

void (*__free_hook)(void *ptr, const void *caller);

void (*__malloc_initialize_hook)(void);

void (*__after_morecore_hook)(void);


The GNU C library lets you modify the behavior of malloc(3), realloc(3), and free(3) by specifying appropriate hook functions. You can use these hooks to help you debug programs that use dynamic memory allocation, for example.

The variable __malloc_initialize_hook points at a function that is called once when the malloc implementation is initialized. This is a weak variable, so it can be overridden in the application with a definition like the following:

void (*__malloc_initialize_hook)(void) = my_init_hook;

Now the function my_init_hook() can do the initialization of all hooks.

The four functions pointed to by __malloc_hook, __realloc_hook, __memalign_hook, __free_hook have a prototype like the functions malloc(3), realloc(3), memalign(3), free(3), respectively, except that they have a final argument caller that gives the address of the caller of malloc(3), etc.

The variable __after_morecore_hook points at a function that is called each time after sbrk(2) was asked for more memory.


These functions are GNU extensions.


The use of these hook functions is not safe in multithreaded programs, and they are now deprecated. Programmers should instead preempt calls to the relevant functions by defining and exporting functions such as "malloc" and "free".


Here is a short example of how to use these variables.

#include <stdio.h>
#include <malloc.h>

/* Prototypes for our hooks. */
static void my_init_hook(void);
static void *my_malloc_hook(size_t, const void *);

/* Variables to save original hooks. */
static void *(*old_malloc_hook)(size_t, const void *);

/* Override initializing hook from the C library. */
void (*__malloc_initialize_hook) (void) = my_init_hook;

static void
old_malloc_hook = __malloc_hook;
__malloc_hook = my_malloc_hook;

static void *
my_malloc_hook(size_t size, const void *caller)
void *result;

/* Restore all old hooks */
__malloc_hook = old_malloc_hook;

/* Call recursively */
result = malloc(size);

/* Save underlying hooks */
old_malloc_hook = __malloc_hook;

/* printf() might call malloc(), so protect it too. */
printf("malloc(%u) called from %p returns %p\n",
(unsigned int) size, caller, result);

/* Restore our own hooks */
__malloc_hook = my_malloc_hook;

return result;


mallinfo(3), malloc(3), mcheck(3), mtrace(3)


This page is part of release 3.69 of the Linux man-pages project. A description of the project, information about reporting bugs, and the latest version of this page, can be found at−pages/.

More Linux Commands

systemd-user.conf(5) System and session service manager conf
When run as system instance systemd reads the configuration file system.conf, otherwise user.conf. These configuration files contain a few settings controlling

pam_close_session(3) - terminate PAM session management.....
The pam_close_session function is used to indicate that an authenticated session has ended. The session should have been created with a call to pam_open_session

gnutls_openpgp_privkey_get_subkey_idx(3) - API function.....
Get index of subkey. RETURNS the index of the subkey or a negative error value. SINCE 2.4.0 REPORTING BUGS Report bugs to &lt;;. GnuTLS home page

tcsendbreak(3) - get and set terminal attributes, line contr
The termios functions describe a general terminal interface that is provided to control asynchronous communications ports. The termios structure Many of the fun

glEvalMesh2(3gl) - compute a one- or two-dimensional grid of
glMapGrid and glEvalMesh are used in tandem to efficiently generate and evaluate a series of evenly-spaced map domain values. glEvalMesh steps through the integ

prunehistory(8) - Remove tokens from Usenet history file....
prunehistory modifies a history(5)-format text file to remove a set of tokens from it. The tokens are removed by overwriting them with spaces, so that the size

tclvars(n) - Variables used by Tcl - Linux manual page......
tclvars.n - The following global variables are created and managed automatically by the Tcl library. Except where noted below, these variables should normally b

ping(8) - send ICMP ECHO_REQUEST to network hosts (ManPage)
ping uses the ICMP protocols mandatory ECHO_REQUEST datagram to elicit an ICMP ECHO_RESPONSE from a host or gateway. ECHO_REQUEST datagrams (pings) have an IP a

gdbm(3) - The GNU database manager. Includes dbm and ndbm co
GNU dbm is a library of routines that manages data files that contain key/data pairs. The access provided is that of storing, retrieval, and deletion by key and

TAP::Parser::Iterator::Stream(3pm) - Iterator for filehandle
This is a simple iterator wrapper for reading from filehandles, used by TAP::Parser. Unless youre writing a plugin or subclassing, you probably wont need to use

netlink(3) - Netlink macros (Library - Linux man page)......
&lt;linux/netlink.h&gt; defines several standard macros to access or create a netlink datagram. They are similar in spirit to the macros defined in cmsg(3) for auxili

XeviGetVisualInfo(3) - X Extended Visual Information functio
The X11 Extended Visual Information extension (EVI) allows a client to determine information about core X visuals beyond what the core protocol provides. The EV

We can't live, work or learn in freedom unless the software we use is free.