일부 읽기 후에 C#으로 코딩 한 모든 것이 코드 관리이며 메모리 누수를주지 않아야한다는 것을 알았습니다. 그러나 내 프로그램은 일종의 메모리 누수를 암시하는 방식으로 동작합니다.user32 및 메모리 누수가 발생 했습니까?
내 전체 프로그램은이 내려 온다 : 이
while(true)
{
//Source of the "leak"
List<object> _objects = ReturnAllWindows();
//Do something awesome with the list...
System.Threading.Thread.Sleep(10);
}
ReturnAllWindows
모든 창문을 얻을 user32.dll
및 EnumWindows
와 함께 pinvoke
를 사용하는 방법이다 (현재 내가 실제 코드를 가지고 있지 않습니다) 현재 열려 있습니다.
내 프로그램을 실행하면 OutOfMemoryException
이 될 때까지 즉시 메모리가 급증합니다.
제가 읽은 바로는 생각할 수있는 유일한 것은 EnumWindows
함수에서 메모리 누수가 발생하지만 입니다. user32가 완전히 관리되지 않는다고 상상하기가 쉽지 않습니다.
그래서 무슨 일입니까? 어떻게 예방할 수 있습니까?
편집: 그것을 해결, 문제는이 목록은 나중에 제대로 처리되지 않은 일부 멀티 스레딩과 함께 사용하는 것이 었습니다.
ReturnAllWindows
행에 주석을 달면 멀티 스레딩에 도달하지 못했고 플랫폼 호출은 전혀 문제가되지 않았습니다.
GC.Collect()를 호출 해 보았습니까?당신이'OutOfMemoryException'을 얻는 것은 이상하게 보일뿐입니다.'GC.Collect()'를 호출하면 예외를 피할 수 있었을 것입니다. 그러나 그게 어떻게 된 것입니까? – Nolonar
"C#으로 코딩 한 모든 것은 관리되는 코드입니다. " : 정확히. 포인터에 액세스하려면 [unsafe] (http://msdn.microsoft.com/en-us/library/t2yzs44b.aspx) 키워드를 사용할 수 있습니다. – cvraman
GetWindows() 코드가 있습니까? 어떻게 메모리를 할당합니까? 전역/스레드 메모리를 사용하여 목록을 작성하거나 목록을 작성하고 전역/스레드 변수에 저장하면 목록이 제어 불능 상태가 될 수 있습니다. GetWindows() 코드가 없으면 진단하기가 어려울 것입니다. – Richard