Próbuję użyć haczyka malloc do utworzenia niestandardowej funkcji my_malloc(). W moim głównym programu podczas zgłoszę malloc() chcę go nazywać my_malloc() może ktoś proszę dać mi przykład o tym, jak to zrobić w CKorzystanie z haczyków Malloc
Odpowiedz
#undef malloc
#define malloc my_malloc
Wystarczy umieścić że na wierzchu żadnych plików musisz to zrobić.
Jeśli twoja funkcja wywołuje sbrk bezpośrednio, możesz po prostu nazwać ją malloc i upewnić się, że zostanie dołączona przed malloc biblioteki. Działa to na wszystkich systemach typu Unix. W przypadku okien zobacz Is there a way to redefine malloc at link time on Windows?
Jeśli twoja funkcja jest opakowaniem wokół biblioteki malloc, sugestia #define autorstwa Alex zadziała.
Zgodnie z http://www.gnu.org/software/libtool/manual/libc/Hooks-for-Malloc.html, oto jak to zrobić z bibliotekami 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()
{
...
}
co znaczy "old_malloc_hook = __malloc_hook;"? Jestem zdezorientowany. Przedtem ustawiamy '__malloc_hook' na' old_malloc_hook', dlaczego znowu zapisujemy '__malloc_hook' na' old_malloc_hook'? Moje pytanie jest tutaj http://stackoverflow.com/questions/11356958/how-to-use-malloc-hook/11357013#comment14960880_11357013 –
David Schwartz wspomniał w swojej odpowiedzi na http://stackoverflow.com/questions/11356958/how -to-use-malloc-hook, że zapisanie oryginalnego __malloc_hook jest ważne, aby można go było przywrócić tuż przed wywołaniem oryginalnej funkcji malloc(). To jest linia tuż poniżej komentarza/* Przywróć wszystkie stare haki * /. Zgaduję, że w tym konkretnym przypadku jest to niepotrzebne, ponieważ oryginalny haczyk malloc ma wartość zerową, ale aby być bezpiecznym, należy to zrobić. Musi być zapisany we wszystkich trzech funkcjach "my_". W my_malloc i my_free trzeba to zrobić tuż przed wywołaniem funkcji malloc i wolnych funkcji systemu. –
Wystarczy pamiętać, że my_malloc_hook() rozwiązanie naprawdę nie działa w mutlithreaded programu - patrz http://www.phpman.info/index.php/man/malloc_hook/3.
Ten link jest uszkodzony – bersanri
- 1. Wykrywanie haczyków klawiaturowych
- 2. Dostaję błędy Malloc z łykiem
- 3. malloc (sizeof (int)) vs malloc (sizeof (int *)) vs (int *) malloc (sizeof (int))
- 4. malloc + automatyczne liczenie odniesień?
- 5. Wskaźnik malloc do tablicy
- 6. Arena w funkcji Malloc
- 7. malloc w systemach wbudowanych
- 8. malloc i nieważne Wskaźniki
- 9. Programy alokacji Malloc
- 10. malloc: nieprawidłowy wskaźnik rozkolejkowywana z bezpłatnym listy
- 11. powracający ciąg znaków z funkcji bez malloc
- 12. Owijanie malloc - C
- 13. wyrównane malloc() w GCC?
- 14. preferując malloc nad calloc
- 15. Malloc tablica wewnątrz struktury
- 16. Jak malloc char ** tabeli?
- 17. boost :: program_options daje Malloc error
- 18. C: Rozszerzanie tablicy o malloc
- 19. optymalizacja malloc i gcc 2
- 20. prosta i przenośna biblioteka malloc
- 21. Segfaults w malloc() i malloc_consolidate()
- 22. Malloc, wskaźniki łańcuchowe i Valgrind
- 23. Malloc, wolny i segmentacja winy
- 24. Różnica między malloc a dlmalloc
- 25. Kod dla malloc i bezpłatny
- 26. Zapobieganie spamowi; Korzystanie z Nodemailer; Korzystanie z Sendmaila
- 27. W C są malloc (256) i malloc (sizeof (char) * 256) równoważne?
- 28. C - malloc - nieprawidłowa konwersja z void * na podwójne *
- 29. Szalony czas spędzony na hakach z free/malloc, pamięci zewnętrznej?
- 30. korzystanie z usługi ntp
więc jeśli utworzyć plik include my_malloc.c i dołączyć go do mojego programu głównego i po prostu zrobić to będzie wywoływać my_malloc zamiast malloc? –
To będzie działać tylko dla wywołań bezpośrednio do malloc() w tym pliku. Nie ma to wpływu na wszelkie wywołania funkcji malloc w funkcjach w innych plikach (lub w bibliotece, której nie kontrolujesz). Jeśli jednak to zrobisz, prawdopodobnie powinieneś mieć także my_realloc. –
#undefine nie jest prawidłową dyrektywą preprocesora C, jest #undef – philant