Как платформа .NET выделяет память для OutOfMemoryException?

В С++ на самом деле можно выбросить исключение по значению без выделения памяти в кучу, поэтому такая ситуация имеет смысл. Но в .NET framework 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.

Примечание. Некоторые из этих исходных файлов большие и могут зависеть от вашего браузера в течение нескольких секунд, пока он загружает подсветку синтаксиса.

Сайты вызовов, которые Тим Шмельтер связал в комментарии к другому ответу, не связаны с тем, что время выполнения заканчивается из памяти и неспособно построить объект.