2010-11-29 8 views
5

En C++, usted can organiza el llamado de una función cada vez que new falla. ¿Hay alguna manera de tener una función llamada cada vez que malloc falla? Supongamos que se llama a malloc desde bibliotecas de terceros que no deseo cambiar.¿Hay un equivalente de set_new_handler() para fallas de malloc()?

No creo que haya una respuesta portátil, así que aceptaré felizmente las específicas de la plataforma. Estoy usando Linux + uclibc en algunas plataformas y Linux + glibc en otras. Estoy planeando utilizar para limitar la cantidad de memoria malloc puede devolver.

+0

Nosotros Supongo que has cancelado el compromiso. ¿Derecha? –

+0

Conrad: Eso espero, pero no poseo todo el sistema, solo estoy proporcionando una aplicación. La gente que diseña el sistema me ha prometido una cierta cantidad de RAM y, a cambio, tengo que prometerme que me mantendré dentro de ese límite. (Este es un dispositivo integrado sin intercambio, por lo que la gente se toma muy en serio los presupuestos de memoria y se asegura de que todo encaje). – user9876

Respuesta

11

malloc devuelve NULL si falla. Debería manejar eso y otras fallas de las funciones de memoria CRT (realloc especialmente es fácil equivocarse).

En el caso general, creo que tendrías que ajustar todo el uso de la memoria CRT en las funciones de tu propio diseño para redirigir en caso de error.

En Windows puede enganchar en el CRT usando Allocation Hook Functions, que podría ser una forma de hacer lo que quiera. Esto le da un gancho para manejar las llamadas CRT a través de la lógica para onalloc, onrealloc, onfree, efectivamente.

No hago ninguna garantía ya que soy un chico de Windows pero parece que malloc_hook on Linux ofrece lo mismo que el enganche de Windows permite. Estos métodos deberían permitirle capturar todas las llamadas de memoria CRT sin cambiar el código en las bibliotecas de terceros, suponiendo que todos utilicen el mismo CRT en tiempo de ejecución; siempre es una buena idea, pero no está garantizado en Windows al menos ...

+0

Sí, '__malloc_hook()' es la función correcta en Linux (al menos glibc, no sé sobre uclibc). – caf

+0

En una página man más reciente: "El uso de estas funciones de enlace no es seguro en programas multiproceso, y ahora están en desuso. Los programadores deben adelantarse a las llamadas a las funciones relevantes definiendo y exportando funciones como" malloc "y" free "." http://www.kernel.org/doc/man-pages/online/pages/man3/malloc_hook.3.html – user9876

Cuestiones relacionadas