Saltar al contenido

Delphi: ¿Cómo encontrar y corregir un error EOutOfMemory?

Solución:

EOutOfMemory ocurre cuando el administrador de memoria no puede encontrar un bloque contigioso de memoria para una solicitud de asignación determinada. Entonces, está 1) asignando más memoria de la que espera, 2) perdiendo memoria que ha asignado correctamente o 3) fragmentando (no necesariamente perdiendo) memoria para que el administrador de memoria tenga que seguir asignando más y más memoria a lo largo del tiempo.

Cuando ocurre la excepción, mire la pila de llamadas. Eso lo llevará al código que no puede asignar memoria. Para obtener la pila de llamadas, ejecute su aplicación en el depurador o use un marco de registro de excepciones como MadExcept, EurekaLog, JCLExcept, etc.

Dudo que el código que está mostrando sea la fuente del problema. Probablemente sea un lugar donde ocurre un síntoma.

Si sospecha que tiene, de hecho, algún daño básico de bajo nivel, puede intentar activar el modo de depuración completa de FastMM. Por ejemplo, problemas como el que está encontrando podrían deberse a daños en el montón de memoria general en lugar de quedarse sin memoria.

Si no tiene daños en el montón, pero en su lugar tiene un verdadero problema de falta de memoria, entonces encontrarlo y resolverlo generalmente requiere una herramienta adecuada, llamada generador de perfiles, como AQTime. Quizás su código de asignación es incorrecto de una manera que pueda entender si simplemente depura su código y encuentra que en algún lugar está tratando de obtener una cantidad de memoria irrazonable, ya sea en una, o en una serie de llamadas a alguna función de asignación de memoria.

Sin embargo, sin un generador de perfiles, como nexus quality suite o AQTime, u otra herramienta similar, estará mayormente ciego. Su aplicación simplemente está fallando y el código de administración del montón informa que no tiene memoria. Es posible que esté haciendo algo en algún lugar que esté corrompiendo su montón. Es posible que realmente esté asignando demasiada memoria para su proceso de 32 bits. Es posible que su computadora no tenga suficiente memoria real o virtual, o que esté asignando una enorme estructura de datos de la que no se haya dado cuenta de que no es práctico, dentro de su aplicación.

¿Ha instalado la versión completa del administrador de memoria FastMem? Puede ayudarlo a rastrear errores en el manejo de la memoria. Vea si tiene una fuga.

Si no tiene una fuga, tiene un problema de fragmentación bastante extremo, tendrá que lidiar con él manteniendo un grupo de objetos en lugar de seguir asignándolos / desasignándolos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *