No C ++, é realmente possível lançar uma exceção por valor sem alocar memória em uma pilha, portanto, essa situação faz sentido. Mas no .NET framework OutOfMemoryException
é um tipo de referência, portanto, ele é alocado em um heap. Como o .NET framework aloca memória para OutOfMemoryException
quando não há memória suficiente para criar um novo objeto?
c#
.net
out-of-memory
RX_DID_RX
fonte
fonte
Respostas:
É pré-alocado pelo tempo de execução. Se você explorar a pilha de qualquer processo gerenciado, encontrará uma instância dessa exceção.
Aqui estão as exceções pré-alocadas de um aplicativo Hello World:
fonte
OutOfMemoryException
é chamado.StackOverflowException
poderá pegá-lo, mas se o tempo de execução lançar essa exceção, não poderá pegá-lo (por padrão).Quando uma condição de falta de memória é encontrada dentro do tempo de execução, chama ThrowOutOfMemory . Isso chama Exception :: GetOOMException , que constrói o objeto na pilha e o copia para uma instância global alocada estaticamente, que é lançada.
Esta não é a exceção gerenciada, porém, uma exceção de C ++ declarada em ex.h . As exceções do C ++ são convertidas em exceções gerenciadas no clrex.cpp , que contém o código para lançar especificamente a OutOfMemoryException gerenciada pré- alocada, originalmente alocada e construída em appdomain.cpp .
Nota: Alguns desses arquivos de origem são grandes e podem travar o navegador por alguns segundos enquanto carrega o realce da sintaxe.
Os sites de ligação que Tim Schmelter vinculou em um comentário sobre a outra resposta não estão relacionados ao tempo de execução da memória e à incapacidade de construir um objeto.
fonte