2008-11-06 11 views
5

का उपयोग करते हुए मैं एक कस्टम समारोह my_malloc बनाने के लिए एक malloc हुक का उपयोग करने के कोशिश कर रहा हूँ()। अपने मुख्य कार्यक्रम में जब मैं malloc() मैं इसे my_malloc कॉल करना चाहते हैं फोन() किसी ने मुझे कैसे सी में यह करने के लिए पर एक उदाहरण देना कृपया कर सकते हैंMalloc हुक्स

उत्तर

-3
#undef malloc 
#define malloc my_malloc 

बस से किसी भी फ़ाइल के शीर्ष पर डाल दिया है कि आपको इसके लिए करने की ज़रूरत है।

+0

इसलिए यदि मैं एक फ़ाइल को शामिल my_malloc.c बनाने और इसे अपने मुख्य कार्यक्रम में शामिल हैं और बस करो कि यह malloc के बजाय my_malloc फोन करेगा? –

+1

यह केवल उस फ़ाइल में सीधे malloc() को कॉल के लिए काम करेगा। किसी भी malloc अन्य फ़ाइलों में कार्यों में कॉल (या एक पुस्तकालय में जिसे आप नियंत्रित नहीं करते हैं) प्रभावित नहीं होंगे। यदि आप ऐसा करते हैं, तो आपको शायद my_realloc भी होना चाहिए। –

+0

#undefine वैध सी प्रीप्रोसेसर निर्देश नहीं है, यह #undef – philant

1

यदि आपका फ़ंक्शन सीधे स्क्रैब कहता है तो आप इसे आसानी से मॉलोक कहते हैं और यह सुनिश्चित कर सकते हैं कि यह लाइब्रेरी के मॉलोक से पहले लिंक हो जाए। यह सभी यूनिक्स प्रकार ओएस पर काम करता है। विंडोज़ के लिए Is there a way to redefine malloc at link time on Windows?

यदि आपका फ़ंक्शन लाइब्रेरी के मॉलोक के चारों ओर एक रैपर है, तो # एलेक्स द्वारा परिभाषित सुझाव काम करेगा।

5

http://www.gnu.org/software/libtool/manual/libc/Hooks-for-Malloc.html के अनुसार, यहां कैसे जीसीसी पुस्तकालयों के साथ यह करने के लिए है।

/* Prototypes for __malloc_hook, __free_hook */ 
#include <malloc.h> 

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

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

static void 
my_init_hook (void) 
{ 
    old_malloc_hook = __malloc_hook; 
    old_free_hook = __free_hook; 
    __malloc_hook = my_malloc_hook; 
    __free_hook = my_free_hook; 
} 

static void * 
my_malloc_hook (size_t size, const void *caller) 
{ 
    void *result; 
    /* Restore all old hooks */ 
    __malloc_hook = old_malloc_hook; 
    __free_hook = old_free_hook; 
    /* Call recursively */ 
    result = malloc (size); 
    /* Save underlying hooks */ 
    old_malloc_hook = __malloc_hook; 
    old_free_hook = __free_hook; 
    /* printf might call malloc, so protect it too. */ 
    printf ("malloc (%u) returns %p\n", (unsigned int) size, result); 
    /* Restore our own hooks */ 
    __malloc_hook = my_malloc_hook; 
    __free_hook = my_free_hook; 
    return result; 
} 

static void 
my_free_hook (void *ptr, const void *caller) 
{ 
    /* Restore all old hooks */ 
    __malloc_hook = old_malloc_hook; 
    __free_hook = old_free_hook; 
    /* Call recursively */ 
    free (ptr); 
    /* Save underlying hooks */ 
    old_malloc_hook = __malloc_hook; 
    old_free_hook = __free_hook; 
    /* printf might call free, so protect it too. */ 
    printf ("freed pointer %p\n", ptr); 
    /* Restore our own hooks */ 
    __malloc_hook = my_malloc_hook; 
    __free_hook = my_free_hook; 
} 

main() 
{ 
    ... 
} 
+0

'old_malloc_hook = __malloc_hook;' मतलब क्या है? मैं उलझन में हूं। हम '' को पहले old_malloc_hook', __malloc_hook' सेट कारण है कि हम '' __malloc_hook' फिर old_malloc_hook' को बचाने के? मेरा सवाल यहां है http://stackoverflow.com/questions/11356958/how-to-use-malloc-hook/11357013#comment14960880_11357013 –

+0

डेविड श्वार्टज़ ने http://stackoverflow.com/questions/11356958/how के जवाब में उल्लेख किया करने के लिए उपयोग-malloc हुक है कि मूल __malloc_hook बचत महत्वपूर्ण है ताकि यह मूल malloc से पहले बहाल किया जा सकता() कहा जाता है। टिप्पणी के ठीक नीचे यह पंक्ति है/* सभी पुराने हुक पुनर्स्थापित करें * /। मैं अनुमान लगा रहा हूं कि इस विशिष्ट मामले में, यह अनावश्यक है, क्योंकि मूल मॉलोक हुक शून्य है, लेकिन सुरक्षित होने के लिए इसे किया जाना चाहिए। इसे "my_" कार्यों में से तीन में सहेजना होगा। My_malloc और my_free में, यह सिस्टम के malloc और मुफ्त कार्यों को कॉल करने से ठीक पहले किया जाना चाहिए। –

1

बस ध्यान दें कि my_malloc_hook() समाधान नहीं वास्तव में mutlithreaded कार्यक्रम में काम करता है - http://www.phpman.info/index.php/man/malloc_hook/3 देखते हैं।

+0

यह लिंक टूटा हुआ है – bersanri

संबंधित मुद्दे