Введение
Следующий код показывает, что при использовании runhaskell
Haskell Garbage Collector освобождает память, когда a
больше не используется. Это приводит к дампу ядра при выпуске переменной 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 prompt, я также могу изменить код ghci
. Может быть, я могу освободить этот a
с помощью modyfing интерактивного контекста ghci или DynFlags? До сих пор мне не повезло с моим reaserch.