En C ++ es posible lanzar una excepción por valor sin asignar memoria en un montón, por lo que esta situación tiene sentido. Pero en .NET framework OutOfMemoryException
es un tipo de referencia, por lo tanto, se asigna en un montón. ¿Cómo asigna .NET Framework la memoria para OutOfMemoryException
cuando no hay suficiente memoria para crear un nuevo objeto?
c#
.net
out-of-memory
RX_DID_RX
fuente
fuente
Respuestas:
Está preasignado por el tiempo de ejecución. Si explora el montón de cualquier proceso administrado, encontrará una instancia de esa excepción.
Estas son las excepciones preasignadas de una aplicación Hello World:
fuente
OutOfMemoryException
se llama.StackOverflowException
puedes atraparlo, pero si el tiempo de ejecución arroja esa excepción, no puedes atraparlo (por defecto).Cuando se encuentra una condición de falta de memoria dentro del tiempo de ejecución, llama a ThrowOutOfMemory . Esto llama Exception :: GetOOMException , que construye el objeto en la pila y luego lo copia en una instancia global asignada estáticamente, que luego se arroja.
Esta no es la excepción conseguido, sin embargo, una excepción de C ++ declaró en ex.h . Las excepciones de C ++ se convierten en excepciones administradas en clrex.cpp , que contiene código para lanzar específicamente la excepción OutOfMemoryException administrada previamente asignada, que originalmente se asignó y construyó en appdomain.cpp .
Nota: Algunos de estos archivos de origen son grandes y pueden colgar su navegador durante varios segundos mientras carga el resaltado de sintaxis.
Los sitios de llamadas que Tim Schmelter enlazó en un comentario sobre la otra respuesta no están relacionados con el tiempo de ejecución que se está quedando sin memoria y no puede construir un objeto.
fuente