FunPtr は、必要なときに (同じ関数に対して) 新しいものを作成してその割り当て解除を処理するのではなく、最上位関数に対して一度だけ作成することが望ましいようです。
以外の FunPtr を取得する方法を見落としていforeign import ccall "wrapper"
ますか? そうでない場合、私の回避策は以下のコードのようになります。それは安全ですか?
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)
編集:「毎回新しいものを作成する」バリアント(main = forever (mkSomeCallback f)
)が実際にメモリをリークしないfreeHaskellFunPtr
ことを確認しました。