Tengo un error bastante serio en mi programa: llamadas ocasionales a new() arrojan bad_alloc.Estrategia de depuración para encontrar la causa de bad_alloc
De la documentación que puedo encontrar en bad_alloc, parece ser arrojado por estas razones:
Cuando el ordenador se queda sin memoria (que definitivamente no está pasando, tengo 4 GB de RAM, programa arroja bad_alloc cuando usa menos de 5MB (comprobado en taskmanager) sin ejecutar nada serio en el fondo).
Si la memoria se fragmenta demasiado para asignar nuevos bloques (lo cual, una vez más, es improbable, el bloque de mayor tamaño que he asignado sería de 1 KB y no se hace más de 100 veces antes de que ocurra el bloqueo))
Basado en estas descripciones, realmente no tengo ningún lugar en el que se pueda lanzar un bad_alloc.
Sin embargo, la aplicación que estoy ejecutando ejecuta más de un hilo, lo que posiblemente podría estar contribuyendo al problema. Al probar todos los objetos en un solo hilo, todo parece funcionar sin problemas. La única otra cosa que puedo pensar que está sucediendo aquí podría ser algún tipo de condición de carrera provocada al llamar a new() en más de un lugar al mismo tiempo, pero he intentado agregar mutexes para evitar ese comportamiento. sin efecto.
Como el programa tiene varios cientos de líneas y no tengo idea de dónde se encuentra realmente el problema, no estoy seguro de qué fragmentos de código, si es que hay alguno, se publicarán. En cambio, me preguntaba si había alguna herramienta que me ayudara a probar este tipo de cosas, o si hay alguna estrategia general que pueda ayudarme con este problema.
Estoy usando Microsoft Visual Studio 2008, con Poco para enhebrar.
En realidad ese era el problema ... ni idea de dónde estaba exactamente el problema, pero hay muchas variables destrozadas deambulando en lugares extraños, parece que había una condición de carrera en alguna parte. ¡Gracias! – Salami
Ese fue mi caso ... pensé que estaba llamando 'new char [_len]', pero estaba llamando 'new char [len]' cuando 'len' no se había inicializado, por lo que probablemente era un número enorme. Realmente ayudó a pensar cuánto espacio estoy pidiendo y a mirar los valores más cerca. Gracias por la respuesta. – flcoder