Dalam C ++ sebenarnya mungkin untuk melempar pengecualian dengan nilai tanpa mengalokasikan memori pada tumpukan, jadi situasi ini masuk akal. Tetapi dalam .NET framework OutOfMemoryException
adalah tipe referensi, oleh karena itu dialokasikan pada heap. Bagaimana .NET framework mengalokasikan memori OutOfMemoryException
ketika tidak ada cukup memori untuk membuat objek baru?
c#
.net
out-of-memory
RX_DID_RX
sumber
sumber
Jawaban:
Ini dialokasikan oleh runtime. Jika Anda menjelajahi tumpukan proses yang dikelola, Anda akan menemukan contoh pengecualian itu.
Berikut adalah pengecualian yang telah dialokasikan sebelumnya dari aplikasi Hello World:
sumber
OutOfMemoryException
disebut.StackOverflowException
Anda dapat menangkapnya, tetapi jika runtime melempar pengecualian itu, Anda tidak dapat menangkapnya (secara default).Ketika kondisi kehabisan memori ditemukan di dalam runtime, ia memanggil ThrowOutOfMemory . Ini memanggil Exception :: GetOOMException , yang membuat objek pada stack dan kemudian menyalinnya ke instance global yang dialokasikan secara statis, yang kemudian dibuang.
Namun, ini bukan Pengecualian yang dikelola, ini merupakan pengecualian C ++ yang dinyatakan dalam ex.h . C ++ Pengecualian dikonversi ke Pengecualian terkelola di clrex.cpp , yang berisi kode untuk secara khusus membuang OutOfMemoryException terkelola yang dialokasikan sebelumnya, yang awalnya dialokasikan dan dibuat di appdomain.cpp .
Catatan: Beberapa file sumber ini berukuran besar dan dapat menggantung browser Anda selama beberapa detik saat memuat highlight sintaksis.
Situs panggilan yang ditautkan oleh Tim Schmelter dalam komentar pada jawaban lain tidak terkait dengan runtime kehabisan memori dan tidak dapat membangun objek.
sumber