__malloc_hook(3)

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

BIBLIOTECA
Biblioteca C standard (libc, -lc)

SINOPSIS
#include <malloc.h>

typeof(void *(size_t size, const void *caller))
*volatile  __malloc_hook;

typeof(void *(void *p, size_t size, const void *caller))
*volatile  __realloc_hook;

typeof(void *(size_t align, size_t size, const void *caller))
*volatile  __memalign_hook;

typeof(void *(void *p, const void *caller))
*volatile  __free_hook;

typeof(void (void))            *__malloc_initialize_hook;
typeof(void (void)) *volatile   __after_mrecore_hook;

DESCRIERE
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:

    typeof(void (void))  *__malloc_initialize_hook = 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.

STANDARDE
GNU.

NOTE
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().

EXEMPLE
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 typeof(void *(size_t, const void *))  *old_malloc_hook;

    /* Suprascrie cârligul de inițializare din biblioteca C */
    typeof(void (void))  *__malloc_initialize_hook = 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 de la %p returnează %p\n",
                size, caller, result);

        /* Restabilește propriile noastre cârlige */
        __malloc_hook = my_malloc_hook;

        return result;
    }

CONSULTAȚI ȘI
mallinfo(3), malloc(3), mcheck(3), mtrace(3)

TRADUCERE
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 (https://www.gnu.org/licenses/gpl-3.0.html) 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.