Estoy tratando de usar un gancho malloc para crear una función personalizada my_malloc(). En mi programa principal cuando llamo malloc() quiero que llame my_malloc() por favor alguien puede dar un ejemplo de cómo hacer esto en CUsando Malloc Hooks
Respuesta
#undef malloc
#define malloc my_malloc
Sólo hay que poner que en la parte superior de cualquiera de los archivos tienes que hacerlo por.
Si su función llama a sbrk directamente, simplemente puede llamarlo malloc y asegurarse de que se vincule antes del malloc de la biblioteca. Esto funciona en todos los sistemas operativos tipo Unix. Para ventanas, vea Is there a way to redefine malloc at link time on Windows?
Si su función es un envoltorio alrededor del malloc de la biblioteca, la sugerencia #define de Alex funcionará.
De acuerdo con http://www.gnu.org/software/libtool/manual/libc/Hooks-for-Malloc.html, a continuación se explica cómo hacer esto con las bibliotecas de 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()
{
...
}
¿Qué significa 'old_malloc_hook = __malloc_hook;'? Estoy confundido. Establecimos '__malloc_hook' a' old_malloc_hook' antes, ¿por qué guardamos '__malloc_hook' en' old_malloc_hook' nuevamente? Mi pregunta es aquí http://stackoverflow.com/questions/11356958/how-to-use-malloc-hook/11357013#comment14960880_11357013 –
David Schwartz mencionó en su respuesta a http://stackoverflow.com/questions/11356958/how -to-use-malloc-hook que es importante guardar el __malloc_hook original para que se pueda restaurar justo antes de llamar al malloc() original. Esa es la línea justo debajo del comentario/* Restaure todos los ganchos viejos * /. Supongo que en este caso específico, no es necesario, ya que el gancho malloc original es nulo, pero para estar seguro debería hacerlo. Debe guardarse en las tres funciones "mi_". En my_malloc y my_free, debe hacerse justo antes de llamar a las funciones malloc y gratuitas del sistema. –
Ten en cuenta que la solución my_malloc_hook() no funciona realmente en el programa mutlithreaded - ver http://www.phpman.info/index.php/man/malloc_hook/3.
Este enlace está roto – bersanri
- 1. Código para malloc y libre
- 2. Git pre-push hooks
- 3. Git hooks management
- 4. Cómo probar git hooks
- 5. usando ganchos gliloc malloc de forma segura para hilos
- 6. CodeIgniter: Hooks (pre_controller) cargando helpers
- 7. Git commit hooks: configuración global
- 8. git hooks y cómo funcionan
- 9. ¿Hay cosas como Email Hooks?
- 10. malloc implementation?
- 11. Git hooks para almacenamiento/recuperación de metadatos
- 12. La mejor manera de hacer hooks PHP
- 13. malloc vs mmap en C
- 14. ¿Es posible utilizar Win32 Hooks en aplicaciones Qt?
- 15. Envasado malloc - C
- 16. cero tamaño malloc
- 17. Malloc en C++ constructor
- 18. Arena en Malloc Función
- 19. ¿Cómo malloc char ** tabla?
- 20. Función Malloc en C++
- 21. alineado malloc() en GCC?
- 22. Guardia Malloc no funciona
- 23. ¿Qué devuelve malloc (0)?
- 24. Problema al anular malloc
- 25. malloc prefiriendo sobre calloc
- 26. ARC & Malloc: EXEC_BAD_ACCESS
- 27. ¿Cómo funciona malloc?
- 28. comportamiento de malloc (0)
- 29. malloc en kernel
- 30. Pruebas unitarias para malloc()
así que si creo un archivo de inclusión my_malloc.c y lo incluyo en mi programa principal y hago eso llamará a my_malloc en lugar de malloc? –
Esto solo funcionará para llamadas directamente a malloc() en ese archivo. Cualquier llamada malloc en funciones en otros archivos (o en una biblioteca que no se ejerce control) no se verán afectadas. Si haces esto, sin embargo, probablemente también tengas un my_realloc. –
#undefine no es una directiva de preprocesador C válida, es #undef – philant