__malloc_hook(3)

الاسم
__malloc_hook, __malloc_initialize_hook, __memalign_hook, __free_hook, __realloc_hook, __after_morecore_hook - متغيرات تصحيح أخطاء malloc (مُهمَلة)

المكتبة
مكتبة سي المعيارية (libc، -lc)

موجز
#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;

الوصف
مكتبة C لجنو تسمح لك بتعديل سلوك malloc(3)، realloc(3)، و free(3) بتحديد دوال ربط مناسبة. يمكنك استخدام هذه الخطافات لمساعدتك في تصحيح أخطاء البرامج التي تستخدم تخصيص الذاكرة الديناميكي، على سبيل المثال.

المتغير __malloc_initialize_hook يشير إلى دالة تُستدعى مرة واحدة عند تهيئة تنفيذ malloc. هذا متغير ضعيف، لذا يمكن تجاوزه في التطبيق بتعريف مثل التالي:

    typeof(void (void))  *__malloc_initialize_hook = my_init_hook;

الآن الدالة my_init_hook() يمكنها القيام بتهيئة جميع الخطافات.

الدوال الأربع المشار إليها بواسطة __malloc_hook، __realloc_hook، __memalign_hook، __free_hook لها نموذج أولي مثل الدوال malloc(3)، realloc(3)، memalign(3)، free(3)، على التوالي، باستثناء أن لها وسيطة أخيرة caller تعطي عنوان المستدعي لـ malloc(3)، إلخ.

المتغير __after_morecore_hook يشير إلى دالة تُستدعى كل مرة بعد طلب المزيد من الذاكرة من sbrk(2).

المعايير
GNU.

ملاحظات
استخدام دوال الربط هذه ليس آمنًا في البرامج متعددة الخيوط، وهي الآن مُهمَلة. من glibc 2.24 فصاعدًا، أُزيل المتغير __malloc_initialize_hook من واجهة البرمجة، ومن glibc 2.34 فصاعدًا، أُزيلت جميع متغيرات الربط من واجهة البرمجة. يجب على المبرمجين بدلاً من ذلك استباق استدعاءات الدوال ذات الصلة بتعريف وتصدير malloc()، free()، realloc()، و calloc().

أمثلة
هذا مثال قصير لكيفية استخدام هذه المتغيرات.

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

    /* Override initializing hook from the C library */
    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;

        /* 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(%zu) called from %p returns %p\n",
                size, caller, result);

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

        return result;
    }

انظر أيضًا
mallinfo(3)، malloc(3)، mcheck(3)، mtrace(3)

ترجمة
تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي <zayed.alsaidi@gmail.com>

هذه الترجمة هي وثيقة مجانية؛ راجع رخصة جنو العامة الإصدار 3 (https://www.gnu.org/licenses/gpl-3.0.html) أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.

إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: kde-l10n-ar@kde.org.