In C ++ ist es tatsächlich möglich, eine Ausnahme nach Wert auszulösen, ohne Speicher auf einem Heap zuzuweisen. Daher ist diese Situation sinnvoll. In .NET Framework OutOfMemoryException
handelt es sich jedoch um einen Referenztyp, daher wird er auf einem Heap zugewiesen. Wie ordnet .NET Framework Speicher zu, OutOfMemoryException
wenn nicht genügend Speicher zum Erstellen eines neuen Objekts vorhanden ist?
c#
.net
out-of-memory
RX_DID_RX
quelle
quelle
Antworten:
Es wird von der Laufzeit vorbelegt. Wenn Sie den Heap eines verwalteten Prozesses untersuchen, finden Sie eine Instanz dieser Ausnahme.
Hier sind die vorab zugewiesenen Ausnahmen einer Hello World-App:
quelle
OutOfMemoryException
heißt.StackOverflowException
es abfangen können , wenn Sie werfen , aber wenn die Laufzeit diese Ausnahme auslöst, können Sie es nicht fangen (standardmäßig).Wenn innerhalb der Laufzeit ein Speichermangel auftritt , wird ThrowOutOfMemory aufgerufen . Dies ruft Exception :: GetOOMException auf , die das Objekt auf dem Stapel erstellt und es dann in eine statisch zugewiesene globale Instanz kopiert, die dann ausgelöst wird.
Dies ist jedoch nicht die verwaltete Ausnahme, sondern eine in ex.h deklarierte C ++ - Ausnahme . C ++ - Ausnahmen werden in clrex.cpp in verwaltete Ausnahmen konvertiert , die Code zum Auslösen der vorab zugewiesenen verwalteten OutOfMemoryException enthalten, die ursprünglich in appdomain.cpp zugewiesen und erstellt wurde .
Hinweis: Einige dieser Quelldateien sind groß und können Ihren Browser einige Sekunden lang hängen lassen, während die Syntaxhervorhebung geladen wird.
Die Aufrufseiten, die Tim Schmelter in einem Kommentar zur anderen Antwort verlinkt hat, haben nichts mit der Laufzeit zu tun, in der der Speicher knapp wird und kein Objekt erstellt werden kann.
quelle