少し読んだ後、C# でコーディングするものはすべてマネージ コードであり、メモリ リークを引き起こすべきではないことがわかりました。それでも、私のプログラムは、ある種のメモリ リークを示唆するような動作をします。
私のプログラム全体は次のようになります:( 現在、実際のコードは持っていません)
while(true)
{
//Source of the "leak"
List<object> _objects = ReturnAllWindows();
//Do something awesome with the list...
System.Threading.Thread.Sleep(10);
}
ReturnAllWindows
とpinvoke
を組み合わせて使用し、現在開いているすべてのウィンドウを取得するメソッドです。user32.dll
EnumWindows
プログラムを実行すると、すぐにメモリが急上昇し、OutOfMemoryException
.
EnumWindows
私が読んだことから、私が考えることができる唯一のことは、関数に何らかのメモリリークがあるということですが、user32 が完全に管理されていないとはほとんど想像できません。
それで、何が起こっているのですか?どうすればそれを防止/回避できますか?
編集: 解決しました。問題は、このリストが後で適切に処理されなかったマルチスレッドと組み合わせて使用されることでした。この行にコメントを付ける
ReturnAllWindows
と、マルチスレッドに到達することはなく、プラットフォームの呼び出しはまったく問題ではありませんでした。