2014-11-13 3 views
4

키를 외부 리소스에 캡슐화하는 형식이 있습니다. 키가 손실되면 (공유하는 모든 값이 범위를 벗어남) 리소스는 일반 값에 대한 메모리와 마찬가지로 다음 가비지 수집에서 해제 (암시 적으로)되어야합니다.공유 값이 범위를 벗어날 때 관리되지 않는 리소스를 처리/해제/"마무리"하는 방법

OOP 처리 또는 ForeignPtr과 비슷한 것을 찾고 있는데, 외국 언어의 개체가 아닌 다른 개체에 대한 참조를 나타냅니다. (ForeignPtr도 적절하고 우아하게 작동 할 수 있지만 대답하는 방법도 알 수 있습니다. 이 질문).

가능합니까? 그렇다면 어떻게?

답변

4

System.Mem.Weak.addFinalizer을 사용할 수 있습니다.

불행히도 약한 참조에 대한 의미는 처음에는 이해하기가 다소 어려울 수 있습니다. 주의 사항은 특히 중요합니다.

키에 IORef, MVar 또는 TVar을 첨부하고 약한 참조/마무리자를 연결하면 훨씬 더 신뢰할 수 있습니다.

키가 관리되지 않는 메모리 (예 : 일부 C 데이터 구조)에 대한 포인터 인 특별한 경우에는 ForeignPtr을 만들고 파이널 라이저를 첨부해야합니다. 이러한 종결 자의 의미는 약간 다릅니다. 임의적 인 IO 액션보다는 finalizer가 외부 함수에 대한 함수 포인터 여야합니다.

5

난 당신이 ResourceT보고 제안 :

ResourceT는 안전하게 자원을 할당 할 수 코드의 영역을 생성하는 모나드 변압기입니다.