a
더 이상 사용하는 경우 다음 코드는, runhaskell
하스켈 가비지 콜렉터를 사용할 때하면 메모리를 해제 있음을 보여줍니다 할 수 있습니다. 변수 a
을 해제하는 동안 코어 덤프가 발생합니다 - 목적을 위해 동작을 검사합니다. a
은 최종 자로 nullFunPtr
을가집니다.
module Main where
import Foreign.Ptr
import Foreign.ForeignPtr
main :: IO()
main = do
a <- newForeignPtr nullFunPtr nullPtr
putStrLn "Hello World"
문제
이 메모리를 해제하지 않습니다 ghci에서 동일하게 실행. ghci가 더 이상 사용 된 변수를 해제하지 않게하려면 어떻게해야합니까?
$ ghci
> import Foreign.Ptr
> import Foreign.ForeignPtr
> import System.Mem
> a <- newForeignPtr nullFunPtr nullPtr
> a <- return() -- rebinding variable a to show gc that I'm no longer using it
> performGC
> -- did not crash - GC didn't release memory
> ^D
Leaving GHCi.
[1] 4396 segmentation fault (core dumped) ghci
메모리가 종료 될 때 릴리스되었지만 너무 늦었습니다. 저는 GHCi를 확장하여 다른 용도로 사용하고 있으며, 메모리를 일찍 출시해야합니다 - 가능한 한 빨리 또는 빨리해야합니다.
나는 finalizeForeignPtr
이라고 부를 수는 있지만, 디버그 목적으로 만 foreignPtr
을 사용하고 있습니다. 마지막 예제에서 일반적으로 a
을 어떻게 풀 수 있습니까?
ghci 프롬프트로 실행할 가능성이없는 경우 ghci
코드를 수정할 수도 있습니다. 이 a
을 ghci Interactive Context 또는 DynFlags으로 수정하여 출시 할 수 있습니까? 지금까지 나는 내 reaserch와 아무런 운이 없어. 즉 HValue
의 이름에 대응 관계 우리는 값이 ClosureEnv
된 데이터 형식 PersistentLinkerState
의 분야 closure_env
에 저장된 것을 알게 코드를 통해 추적
메모리가 해제되지 않았습니까? 변수가 GC 일 때 종료자가 즉시 실행된다는 보장이 없다고 생각합니다. –
오히려 예, 나는 큰 배열로 비슷한 테스트를 수행하고 그것을'ekg'로 모니터링합니다. 아무것도 공개되지 않았다. – remdezx
'()'에 재 할당 한 후 왜'a' 가비지 수집해야합니까? 어떻게 ghci가 (일종의 IO 모나드에서) 필요할 필요가 없다는 것을 알 수 있습니까? –