C ++では、ヒープにメモリを割り当てなくても、値によって例外をスローすることが実際に可能であるため、この状況は理にかなっています。ただし、.NETフレームワークOutOfMemoryException
は参照型であるため、ヒープに割り当てられます。OutOfMemoryException
新しいオブジェクトを作成するのに十分なメモリがない場合、.NET Frameworkはどのようにメモリを割り当てますか?
6
すばらしい質問です。たぶん、そのような状況のために十分なメモリが予約されています。
—
GreatAndPowerfulOz 2015年
ここですでに他の回答に追加するために、OOMは要求したブロックを割り当てることができないことを意味することに注意してください。100Mbを要求し、ランタイムが検出できる最大のブロックが99Mbのみの場合、失敗します。しかし、OOM例外は数バイトのメモリしか必要としません。つまり、割り当てが失敗したからといって、メモリが残っているわけではありません。しかしもちろん、ランタイムがこの状況でそれ自体をカバーするためにいくつかのメモリを予約している可能性があります
—
Jason Williams
ところで、C ++についてのあなたの仮定は正しくありません。コンパイラによっては、例外がヒープに割り当てられる場合があります。MSコンパイラーはそうではありませんが、Common C ++ ABIでは、ヒープにスペースが残っていない場合に代わりに使用される小さな事前割り当て緊急バッファーがあることを除いて、例外はヒープに割り当てられます。
—
Sebastian Redl、2015年