В С++ на самом деле можно выбросить исключение по значению без выделения памяти в кучу, поэтому такая ситуация имеет смысл. Но в .NET framework OutOfMemoryException
является ссылочным типом, поэтому он выделяется в кучу.
Как платформа .NET выделяет память для OutOfMemoryException
, когда памяти недостаточно для создания нового объекта?
Как платформа .NET выделяет память для OutOfMemoryException?
Ответ 1
Он предварительно распределяется по времени выполнения. Если вы исследуете кучу любого управляемого процесса, вы найдете экземпляр этого исключения.
Вот предопределенные исключения из приложения Hello World:
0:003> !dumpheap -stat -type Exception
Statistics:
MT Count TotalSize Class Name
735f2920 1 84 System.ExecutionEngineException
735f28dc 1 84 System.StackOverflowException
735f2898 1 84 System.OutOfMemoryException
735f2744 1 84 System.Exception
735f2964 2 168 System.Threading.ThreadAbortException
Ответ 2
Когда во время выполнения встречается условие нехватки памяти, оно вызывает ThrowOutOfMemory. Это вызывает Exception:: GetOOMException, который строит объект в стеке и затем копирует его в статический адрес глобального экземпляра, который затем вызывается.
Это не управляемое исключение, но это исключение С++, объявленное в ex.h. Исключения С++ преобразуются в управляемые исключения в clrex.cpp, который содержит код, специально предназначенный для броска предварительно выделенного управляемого OutOfMemoryException, которое изначально было выделено и построено в appdomain.cpp.
Примечание. Некоторые из этих исходных файлов большие и могут зависеть от вашего браузера в течение нескольких секунд, пока он загружает подсветку синтаксиса.
Сайты вызовов, которые Тим Шмельтер связал в комментарии к другому ответу, не связаны с тем, что время выполнения заканчивается из памяти и неспособно построить объект.