在C++中,实际上可以通过值抛出异常而不在堆上分配内存,因此这种情况是有意义的。但在.NET框架中,OutOfMemoryException是引用类型,因此它在堆上分配。当没有足够的内存创建新对象时,.NET框架如何为OutOfMemoryException分配内存?
这是运行时预先分配的。如果您探索任何托管进程的堆,您将找到该异常的实例。
这是一个Hello World应用程序的预分配异常:
0:003> !dumpheap -stat -type Exception
Statistics:
MT Count TotalSize Class Name
735f2920 1 84 System.ExecutionEngineException
735f28dc 1 84 System.StackOverflowException
735f2898 1 84 System.OutOfMemoryException
735f2744 1 84 System.Exception
735f2964 2 168 System.Threading.ThreadAbortException
StackOverflowException
异常,你可以捕捉它,但如果运行时抛出该异常,你无法捕捉它(默认情况下)。 - Brian Rasmussen在另一个答案的评论中,Tim Schmelter链接的调用网站与运行时内存耗尽并且无法构造对象无关。