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
#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 đó.
Bạn có nhìn ở đây không? http://www.gnu.org/software/libtool/manual/libc/Hooks-for-Malloc.html
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.
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()
{
...
}
'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 –
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. –
Chỉ cần lưu ý rằng giải pháp my_malloc_hook() không thực sự hoạt động trong chương trình bị cắt xén - xem http://www.phpman.info/index.php/man/malloc_hook/3.
Liên kết này bị hỏng – bersanri
- 1. Phân bổ mảng char sử dụng malloc
- 2. Hooks cho git-svn
- 3. Chaining git hooks
- 4. Khi sử dụng malloc cho con trỏ char
- 5. Sử dụng malloc newlib trong ARM Cortex-M3
- 6. Khi nào và tại sao sử dụng malloc?
- 7. Riak Post-Commit Hooks chạy ở đâu?
- 8. sử dụng các móc trượt glibc malloc theo chủ đề an toàn
- 9. git hooks: có móc móc không?
- 10. Wrapping malloc - C
- 11. Malloc trong C++ constructor
- 12. malloc trong hạt nhân
- 13. xử lý lỗi malloc
- 14. thích malloc qua calloc
- 15. Malloc và Void Pointers
- 16. chu kỳ CPU malloc
- 17. Git hooks - tuyên truyền từ kho lưu trữ từ xa?
- 18. ARC & Malloc: EXEC_BAD_ACCESS
- 19. lỗi malloc trong struct (C)
- 20. Làm thế nào để kiểm tra git hooks
- 21. Làm thế nào để echo một gói tin trong không gian hạt nhân bằng cách sử dụng netfilter hooks?
- 22. Arena trong chức năng Malloc
- 23. Tại sao bạn chỉ định kích thước khi sử dụng malloc trong C?
- 24. C Programming: malloc() cho một mảng 2D (sử dụng con trỏ-to-pointer)
- 25. Có thể sử dụng một con trỏ thông minh C++ cùng với malloc của C không?
- 26. Sử dụng CPU và bộ nhớ của jemalloc so với glibc malloc
- 27. Tại sao nó an toàn hơn để sử dụng sizeof (* con trỏ) trong malloc
- 28. LinkedList - Cách giải phóng bộ nhớ được cấp phát bằng cách sử dụng malloc
- 29. Tại sao tôi nhận được "Sử dụng số nhận dạng không khai báo 'malloc'"?
- 30. Tại sao sử dụng malloc/miễn phí, khi chúng tôi có mới/xóa?
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? –
Đ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. –
#undefine không phải là chỉ thị tiền xử lý C hợp lệ, đó là #undef – philant