포인터가 참조되지 않게되는 경우를 이해하는 것은 쉬운 일이 아닙니다. 내가 아는 한, 요청한 것을 수행 할 수있는 방법이 없습니다. 즉, 포인터에 더 이상 도달 할 수 없다는 것을 GC에 알리십시오. 기껏해야 GC주기를 트리거 할 수 있지만 단단한 보장은 없습니다.
설명에서 가비지 수집 대신 참조 계산 메커니즘을 사용하는 것이 좋습니다. 그러나 복잡한 순수 코드에서는 특히 카운터를 증가 또는 감소해야하는 지점을 식별하기가 어렵습니다. 주 또는 IO 기반 모나드에서 이러한 부작용이 올바르게 시퀀싱되는 것이 더 쉬울 것입니다. 나머지 계산.
"1"을 넘는 참조 카운팅을 실제로 필요로하지 않는다면 어떻게 든 일반적 관용구가 할당 및 할당 해제를 처리하기 위해 with
스타일 기능을 사용하고 있습니다. 제대로 처리하기가 다소 까다로울 수 있습니다.
예를 들어, 사소한 구현은
-- very simplified code
withMyResource :: (ResourcePtr -> IO r) -> IO r
withMyResource action = do
p <- allocResourcePtr
result <- action p
deallocResourcePtr p
return result
수 이것은 다음 하나는 포인터를 반환 할 수 있기 때문에이 라이브를하고, 완전히 안전하지 않습니다 것을
로
withResource $ \ptr -> do
use ptr
주를 사용할 수 있습니다 할당 해제 후
ptr <- withResource return
use ptr -- dangerous!
올바르게 포인터 처리 루틴 ne는 ST
모나드와 그 태그가 붙은 STRef
과 같이 작동해야합니다. 포인터는 의도 한 범위를 벗어나지 않도록 설계되었습니다 (위와 동일). 이것은 2 등급 유형을 이용하지만 효과적입니다.
여전히 순진한 with
루틴으로 살 수 있으며 포인터가 이탈하지 않도록주의하십시오.
안전하지 않은 문제는 action
이 예외를 throw 할 수 있기 때문에 발생합니다. (이는 라이브러리의 bracket
루틴을 사용하여 처리 할 수 있습니다.)
출처
2017-12-29 21:30:01
chi
[이 블로그 게시물] (http://www.tweag.io/posts/2017-11-29-linear-jvm.html)에서는이 문제에 대해 설명합니다. 그것은 이런 종류의 일에 대한 예술의 현재 상태에 대한 좋은 요약입니다. – Alec