.Net 프로그램에서 GC가 너무 빠름을 처리하고 있습니다. 네이티브 리소스가있는 클래스를 사용하고 GC.KeepAlive()를 호출하지 않기 때문에 GC는 네이티브 액세스가 끝나기 전에 개체를 수집합니다. 결과적으로 프로그램이 충돌합니다. 그래서 같이JIT가 범위 끝까지 스택 변수를 확장하는 방법 (GC가 너무 빠름)
Does the .NET garbage collector perform predictive analysis of code?
: 여기에 설명 된대로 우리는 정확히 문제가
{ var img = new ImageWithNativePtr();
IntPtr p = img.GetData();
// DANGER!
ProcessData(p);
}
점은 : JIT는 IMG가 점하는 경우에 사용하지 않는 GC를 보여줍니다 정보를 생성 GetData()가 실행됩니다. GC- 쓰레드가 적시에 올 경우, img를 수집하고 프로그램이 충돌합니다. GC.KeepAlive (img)를 추가하여이 문제를 해결할 수 있습니다. 불행히도 이미 너무 많은 코드가 작성되어 (너무 많은 곳에서) 문제를 쉽게 해결할 수 있습니다.
따라서 : 예를 들어 JIT가 디버그 빌드에서와 같이 작동하도록하는 속성 (예 : ImageWithNativePtr)이 있습니까? 디버그 빌드에서 변수 img는 범위 (}) 끝까지 유효하게 유지되지만 릴리스에서는 댓글 DANGER에서 유효성이 느슨합니다.
'GC.KeepAlive'가 유일한 옵션입니다. –
관리되지 않는 리소스가 일종의 처분을 필요로하지 않습니까? –
어리석은 구현에 의존하는 코드가 깨졌습니다. – delnan