__malloc_hook(3) Library Functions Manual __malloc_hook(3)

__malloc_hook, __malloc_initialize_hook, __memalign_hook, __free_hook, __realloc_hook, __after_morecore_hook - variabile de depanare malloc (DEPRECIATE)

Biblioteca C standard (libc, -lc)

#include <malloc.h>
void *(*volatile __malloc_hook)(size_t size, const void *caller);
void *(*volatile __realloc_hook)(void *ptr, size_t size,
                         const void *caller);
void *(*volatile __memalign_hook)(size_t alignment, size_t size,
                         const void *caller);
void (*volatile __free_hook)(void *ptr, const void *caller);
void (*__malloc_initialize_hook)(void);
void (*volatile __after_morecore_hook)(void);

Biblioteca GNU C vă permite să modificați comportamentul lui malloc(3), realloc(3) și free(3) prin specificarea unor funcții cârlig corespunzătoare. Puteți utiliza aceste cârlige pentru a vă ajuta la depanarea programelor care utilizează alocarea dinamică a memoriei, de exemplu.

Variabila __malloc_initialize_hook indică o funcție care este apelată o singură dată atunci când este inițializată implementarea malloc. Aceasta este o variabilă slabă, astfel încât poate fi suprascrisă în aplicație cu o definiție ca cea de mai jos:


void (*__malloc_initialize_hook)(void) = my_init_hook;

Acum, funcția my_init_hook() poate face inițializarea tuturor cârligelor.

Cele patru funcții indicate de __malloc_hook, __realloc_hook, __memalign_hook, __free_hook au un prototip asemănător funcțiilor malloc(3), realloc(3), memalign(3), free(3), respectiv memalign(3), cu excepția faptului că acestea au un argument final caller care oferă adresa apelantului lui malloc(3), etc.

Variabila __after_morecore_hook indică o funcție care este apelată de fiecare dată după ce lui sbrk(2) i s-a cerut mai multă memorie.

GNU.

Utilizarea acestor funcții cârlig nu este sigură în programele cu mai multe fire, iar acum acestea sunt depreciate. Începând cu glibc 2.24, variabila __malloc_initialize_hook a fost eliminată din API, iar începând cu glibc 2.34, toate variabilele cârlig au fost eliminate din API. În schimb, programatorii ar trebui să preîntâmpine apelurile către funcțiile relevante prin definirea și exportul malloc(), free(), realloc() și calloc().

Iată un scurt exemplu de utilizare a acestor variabile.

#include <stdio.h>
#include <malloc.h>
/* Prototipurile pentru cârligele noastre */
static void my_init_hook(void);
static void *my_malloc_hook(size_t, const void *);
/* Variabile pentru a salva cârligele originale */
static void *(*old_malloc_hook)(size_t, const void *);
/* Suprascrie cârligul de inițializare din biblioteca 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;
    /* Restabilește toate cârligele vechi */
    __malloc_hook = old_malloc_hook;
    /* Apel recursiv */
    result = malloc(size);
    /* Salvează cârligele de bază */
    old_malloc_hook = __malloc_hook;
    /* printf() might call malloc(), so protect it too */
    printf("malloc(%zu) apelat din %p returnează %p\n",
            size, caller, result);
    /* Restabilește propriile noastre cârlige*/
    __malloc_hook = my_malloc_hook;
    return result;
}

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

Traducerea în limba română a acestui manual a fost făcută de Remus-Gabriel Chelu <remusgabriel.chelu@disroot.org>

Această traducere este documentație gratuită; citiți Licența publică generală GNU Versiunea 3 sau o versiune ulterioară cu privire la condiții privind drepturile de autor. NU se asumă NICIO RESPONSABILITATE.

Dacă găsiți erori în traducerea acestui manual, vă rugăm să trimiteți un e-mail la translation-team-ro@lists.sourceforge.net.

2 mai 2024 Pagini de manual de Linux 6.8