W C ++ faktycznie można zgłosić wyjątek według wartości bez przydzielania pamięci na stercie, więc ta sytuacja ma sens. Ale w .NET Framework OutOfMemoryException
jest typem referencyjnym, dlatego jest przydzielany na stercie. W jaki sposób platforma .NET Framework przydziela pamięć, OutOfMemoryException
gdy jest za mało pamięci do utworzenia nowego obiektu?
c#
.net
out-of-memory
RX_DID_RX
źródło
źródło
Odpowiedzi:
Jest wstępnie przydzielany przez środowisko wykonawcze. Jeśli zbadasz stertę dowolnego zarządzanego procesu, znajdziesz wystąpienie tego wyjątku.
Oto wstępnie przydzielone wyjątki aplikacji Hello World:
źródło
OutOfMemoryException
nazywa się.StackOverflowException
, możesz go złapać, ale jeśli środowisko wykonawcze zgłosi ten wyjątek, nie możesz go złapać (domyślnie).Gdy w środowisku uruchomieniowym zostanie napotkany warunek braku pamięci, wywołuje ThrowOutOfMemory . To wywołuje Exception :: GetOOMException , który konstruuje obiekt na stosie, a następnie kopiuje go do statycznie przydzielonej instancji globalnej, która jest następnie generowana.
To nie jest zarządzany Wyjątek jednak, że jest to wyjątek C ++ zadeklarowane w ex.h . C ++ Wyjątki są konwertowane na zarządzanych wyjątków w clrex.cpp , który zawiera kod do specjalnie rzucać zdefiniowanej przez zarządzaną OutOfMemoryException, który został pierwotnie przydzieloną i skonstruowany w appdomain.cpp .
Uwaga: niektóre z tych plików źródłowych są duże i mogą zawiesić przeglądarkę na kilka sekund podczas ładowania podświetlania składni.
Witryny wywołań, które Tim Schmelter połączył w komentarzu do drugiej odpowiedzi, nie są związane z brakiem pamięci w środowisku wykonawczym i niemożnością skonstruowania obiektu.
źródło