2008-11-06 33 views
5

Tôi đang cố gắng sử dụng một móc malloc để tạo ra một hàm tùy chỉnh my_malloc(). Trong chương trình chính của tôi khi tôi gọi malloc() Tôi muốn nó gọi my_malloc() có thể một người nào đó xin vui lòng cho tôi một ví dụ về cách để làm điều này trong CSử dụng Malloc Hooks

Trả lời

-3
#undef malloc 
#define malloc my_malloc 

Chỉ cần đặt rằng ở phía trên cùng của bất kỳ tập tin bạn cần phải làm điều đó.

+0

vì vậy nếu tôi tạo tệp include my_malloc.c và đưa nó vào chương trình chính của tôi và chỉ cần làm điều đó, nó sẽ gọi my_malloc thay vì malloc? –

+1

Điều này sẽ chỉ làm việc cho các cuộc gọi trực tiếp đến malloc() trong tập tin đó. Bất kỳ cuộc gọi malloc nào trong các hàm trong các tệp khác (hoặc trong thư viện mà bạn không kiểm soát) sẽ không bị ảnh hưởng. Nếu bạn làm điều này, tuy nhiên, bạn có lẽ nên có một my_realloc là tốt. –

+0

#undefine không phải là chỉ thị tiền xử lý C hợp lệ, đó là #undef – philant

1

Nếu chức năng của bạn gọi sbrk trực tiếp, bạn có thể chỉ cần gọi nó là malloc và đảm bảo nó được liên kết trước malloc của thư viện. Điều này hoạt động trên tất cả các hệ điều hành kiểu Unix. Đối với các cửa sổ, hãy xem Is there a way to redefine malloc at link time on Windows?

Nếu hàm của bạn là một trình bao bọc xung quanh thư viện của thư viện, đề xuất #define của Alex sẽ hoạt động.

5

Theo http://www.gnu.org/software/libtool/manual/libc/Hooks-for-Malloc.html, dưới đây là cách thực hiện việc này với thư viện GCC.

/* 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;' nghĩa là gì? Tôi bị bối rối. Chúng ta đặt '__malloc_hook' thành' old_malloc_hook' trước đây, tại sao chúng ta lại lưu '__malloc_hook' vào' old_malloc_hook'? Câu hỏi của tôi là ở đây http://stackoverflow.com/questions/11356958/how-to-use-malloc-hook/11357013#comment14960880_11357013 –

+0

David Schwartz đã đề cập đến câu trả lời của mình cho http://stackoverflow.com/questions/11356958/how -to-use-malloc-hook để lưu __malloc_hook ban đầu là quan trọng để nó có thể được phục hồi ngay trước khi lệnh malloc() ban đầu được gọi. Đó là dòng ngay dưới bình luận/* Khôi phục tất cả các móc cũ * /. Tôi đoán rằng trong trường hợp cụ thể này, nó không cần thiết, vì móc malloc gốc là null, nhưng để an toàn thì nó nên được thực hiện. Nó phải được lưu trong cả ba hàm "my_". Trong my_malloc và my_free, nó phải được thực hiện ngay trước khi gọi các hàm malloc và free miễn phí của hệ thống. –

Các vấn đề liên quan