3

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ことを確認しました。

4

1 に答える 1

5

原則として、これは安全であるべきです。GHC 内部コードは、同様のパターンを使用して、IO 監視ハンドル キューなどのシングルトンを初期化します。mkSomeCallback がいつ実行されるかは制御できないことに注意してくださいNOINLINE

于 2011-06-20T05:37:58.390 に答える