En C ++, il est en fait possible de lever une exception par valeur sans allouer de mémoire sur un tas, donc cette situation a du sens. Mais dans .NET Framework OutOfMemoryException
est un type de référence, il est donc alloué sur un tas. Comment .NET Framework alloue-t-il de la mémoire OutOfMemoryException
lorsqu'il n'y a pas assez de mémoire pour créer un nouvel objet?
c#
.net
out-of-memory
RX_DID_RX
la source
la source
Réponses:
Il est préalloué par le runtime. Si vous explorez le tas de tout processus géré, vous trouverez une instance de cette exception.
Voici les exceptions préallouées d'une application Hello World:
la source
OutOfMemoryException
est appelé.StackOverflowException
vous pouvez l'attraper, mais si le moteur d'exécution lève cette exception, vous ne pouvez pas l'attraper (par défaut).Lorsqu'une condition de mémoire insuffisante est rencontrée dans le runtime, il appelle ThrowOutOfMemory . Cela appelle Exception :: GetOOMException , qui construit l'objet sur la pile, puis le copie dans une instance globale allouée statiquement, qui est ensuite levée.
Ce n'est pas l'exception gérée, cependant, une exception C ++ déclaré dans ex.h . Les exceptions C ++ sont converties en exceptions gérées dans clrex.cpp , qui contient du code pour lancer spécifiquement l'exception OutOfMemoryException gérée préallouée, qui a été initialement allouée et construite dans appdomain.cpp .
Remarque: certains de ces fichiers sources sont volumineux et peuvent bloquer votre navigateur pendant plusieurs secondes pendant qu'il charge la coloration syntaxique.
Les sites d'appels que Tim Schmelter a liés dans un commentaire sur l'autre réponse ne sont pas liés au runtime manquant de mémoire et incapable de construire un objet.
la source