C++では、実際には、ヒープ上にメモリを割り当てずに例外をスローすることができます。しかし.NET FrameworkではOutOfMemoryException
は参照型なので、ヒープに割り当てられます。 新しいオブジェクトを作成するのに十分なメモリがない場合、.NET FrameworkはOutOfMemoryException
のメモリをどのように割り当てますか?.NET FrameworkはOutOfMemoryExceptionのためにどのようにメモリを割り当てますか?
答えて
ランタイムによって事前に割り当てられます。管理対象プロセスのヒープを調べると、その例外のインスタンスが見つかります。メモリ不足の状態がランタイムの内部で発生した
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
しかし、[OutOfMemoryException'のコンストラクタ(http://referencesource.microsoft.com/#mscorlib/system/outofmemoryexception.cs,5ad855b434264d4b,references)が呼び出されています。 –
申し訳ありませんが、私はあなたのポイントが何であるか分かりません。 –
ランタイムは、コードと同じルールで再生する必要はありません。別の例では、 'StackOverflowException'を投げるとcatchすることができますが、実行時にその例外がスローされた場合は、デフォルトでcatchできません。 –
が、それはThrowOutOfMemoryを呼び出します。ここでは
は、Hello Worldのアプリの事前に割り当てられた例外です。これは Exception::GetOOMExceptionを呼び出し、スタック上にオブジェクトを構築し、それを静的に割り当てられたグローバルインスタンスにコピーしてスローします。これは、しかし、それはC++例外ex.hで宣言され、管理さ例外ではありません。 C++の例外は、具体的には事前に割り当てられが元々割り当てられappdomain.cpp構築したのOutOfMemoryExceptionを管理スローするコードを含む、clrex.cppで管理例外に変換されます。
注:これらのソースファイルの一部が大きく、それが構文の強調表示をロードしながら数秒間ブラウザをハングすることがあります。ティムSchmelterが他の回答にコメントでリンク
呼び出しサイトは、ランタイムがメモリ不足やオブジェクトを構築することができないことに関連していません。
- 1. .NETはリストにメモリを割り当てますか?
- 2. EnumはどのようにCにメモリを割り当てますか?
- 3. 大きな配列はどのようにメモリを割り当てますか?
- 4. cでメモリ割り当てはどのように機能しますか?
- 5. 可変メモリ割り当てはどのように機能しますか?
- 6. .net c#クラスのメモリ割り当て
- 7. XCode Instrumentsのメモリ割り当てを担当する特定のメソッドは、どのように見えますか?
- 8. C++ new/new []、どのようにメモリを割り当てるのですか?
- 9. メモリをmalloc()で割り当てよう
- 10. Calloc()が以前に割り当てられたメモリを割り当てようとしています
- 11. Linuxでのメモリ割り当てはPAGE_SIZEよりもどのように小さくなりますか?
- 12. numpyはネストされた配列にどのようにメモリを割り当てますか?
- 13. .NETでグローバル変数にメモリを割り当てる方法は?
- 14. このように割り当てられたメモリの割り当てを解除するにはどうすればいいですか?A&o = *(new A)?
- 15. メモリの割り当ては?
- 16. ダブルフリーまたはメモリ割り当てエラー
- 17. 割り当てられたメモリのビュー
- 18. MemoryStream - 空き領域を割り当てようとしたときのOutOfMemoryException
- 19. Pythonインタプリタはさまざまなメソッドにどのようにメモリを割り当てますか?
- 20. UIImageはより多くのメモリを割り当てます
- 21. サービスはたくさんのメモリを割り当てますか?
- 22. ヒープまたはスタックからのメモリ割り当てですか?
- 23. Cでメモリを割り当てるためのmalloc/callocより優れた実装はありますか?
- 24. シャットダウン前にRAMを消去すると、Linuxはどのようにメモリを割り当てますか?
- 25. NSMutableArrayと他のNsMutableArrayの割り当てはどのように割り当てられますか?
- 26. UNIX fork後に動的に割り当てられたメモリへのポインタはどうなりますか?
- 27. @ "文字列"はどのようにメモリに割り当てられていますか?
- 28. メモリ割り当て
- 29. 割り当てメモリ
- 30. 割り当てメモリ
優秀な質問です。たぶん、その状況のために十分なメモリが予約されている可能性があります。 – GreatAndPowerfulOz
OOMは、リクエストしたブロックを割り当てることができないことを意味しています。あなたが100Mbを要求し、ランタイムが見つけることができる最大の利用可能なブロックが99Mbだけであれば、それは失敗します。しかし、OOM例外は数バイトのメモリしか必要としません。つまり、割り当てが失敗しただけで、メモリがゼロになったということではありません。しかし、もちろん、ランタイムはこの状況でそれ自身をカバーするためにいくらかのメモリを予約する可能性が高いです –
C++に関するあなたの前提は間違っています。コンパイラによっては、例外がヒープに割り当てられる可能性があります。 MSコンパイラは、Common C++ ABIでは、ヒープに例外が割り当てられていますが、ヒープ上にスペースが残っていない場合には代わりに使用される小さな事前割り当てされた緊急バッファがあります。 –