2
FunPtrは、必要なときにいつでも新しい関数を作成してその解放を処理するのではなく、一度だけトップレベルの関数に作成することが望ましいと思われます。Haskell FFI:トップレベルFunPtrからトップレベル関数へ
foreign import ccall "wrapper"
以外のFunPtrを取得する方法を見落としていますか?そうでない場合、私の回避策は以下のコードのようになります。それは安全ですか?
type SomeCallback = CInt -> IO()
foreign import ccall "wrapper" mkSomeCallback :: SomeCallback -> IO (FunPtr SomeCallback)
f :: SomeCallback
f i = putStrLn ("It is: "++show i)
{-# NOINLINE f_FunPtr #-}
f_FunPtr :: FunPtr SomeCallback
f_FunPtr = unsafePerformIO (mkSomeCallback f)
編集:1がfreeHaskellFunPtr
がない場合は、「新しいものを作成するたびに」変異体(main = forever (mkSomeCallback f)
は)事実リークメモリにないことを確認しました。