В C ++ на самом деле можно генерировать исключение по значению без выделения памяти в куче, поэтому такая ситуация имеет смысл. Но в .NET Framework OutOfMemoryException
это ссылочный тип, поэтому он расположен на куче. Как .NET Framework выделяет память для OutOfMemoryException
случаев, когда не хватает памяти для создания нового объекта?
c#
.net
out-of-memory
RX_DID_RX
источник
источник
Ответы:
Он предварительно выделяется средой выполнения. Если вы исследуете кучу любого управляемого процесса, вы найдете экземпляр этого исключения.
Вот предварительно выделенные исключения приложения Hello World:
источник
OutOfMemoryException
называется.StackOverflowException
вы можете поймать его, но если среда выполнения выдает это исключение, вы не можете его поймать (по умолчанию).Когда во время выполнения возникает условие нехватки памяти, он вызывает ThrowOutOfMemory . Это вызывает Exception :: GetOOMException , который создает объект в стеке, а затем копирует его в статически размещенный глобальный экземпляр, который затем генерируется.
Это не удалось Exception, хотя, это исключение C ++ объявлено в ex.h . Исключения C ++ преобразуются в управляемые исключения в clrex.cpp , который содержит код, который специально генерирует предварительно выделенное управляемое исключение OutOfMemoryException, которое изначально было размещено и создано в appdomain.cpp .
Примечание. Некоторые из этих исходных файлов имеют большой размер и могут зависать в браузере на несколько секунд, пока загружается подсветка синтаксиса.
Сайты вызовов, которые Тим Шмельтер связал в комментарии к другому ответу, не связаны с тем, что во время выполнения не хватает памяти и невозможности создать объект.
источник