在C ++中,实际上可以按值引发异常,而无需在堆上分配内存,因此这种情况很有意义。但是在.NET Framework OutOfMemoryException
中,它是一种引用类型,因此它是在堆上分配的。OutOfMemoryException
当没有足够的内存来创建新对象时,.NET Framework如何分配内存?
6
很好的问题。也许只为那种情况保留了足够的内存。
—
GreatAndPowerfulOz 2015年
只是要添加到此处已经存在的其他答案中,请记住,OOM意味着无法分配您请求的块。如果要求100Mb,并且运行时可以找到的最大可用块仅为99Mb,则它将失败。但是,OOM异常仅需要几个字节的内存。因此,仅仅因为分配失败并不意味着剩余的内存为零。但是,当然,它是可能的运行时储备一些内存覆盖自身在这种情况下
—
贾森-威廉姆斯
顺便说一下,您对C ++的假设是不正确的。根据编译器的不同,可以在堆上分配异常。MS编译器没有,但是在Common C ++ ABI中,例外是在堆上分配的,除非堆上没有剩余空间,否则将使用一个小的预分配的紧急缓冲区代替。
—
塞巴斯蒂安·雷德尔