次のコードスニペットを検討してください
import qualified Foreign.Concurrent
import Foreign.Ptr (nullPtr)
main :: IO ()
main = do
putStrLn "start"
a <- Foreign.Concurrent.newForeignPtr nullPtr $
putStrLn "a was deleted"
putStrLn "end"
次の出力が生成されます。
start
end
a was deleted
後のどこかで「」が表示されると思っていたでしょうstart
。
何が起こっているのかわかりません。私はいくつかの推測があります:
- プログラムの終了時に、ガベージコレクターは残りのオブジェクトを収集しません
putStrLn
終了後、動作を停止しmain
ます。(ところで、私は外国から輸入されたもので同じことを試みputs
て、同じ結果を得ました)- 私の理解
ForeignPtr
が不足しています - GHCバグ?(env:GHC 6.10.3、Intel Mac)
Foreign.ForeignPtr.newForeignPtr
代わりに使用すると、Foreign.Concurrent.newForeignPtr
機能するようです。
{-# LANGUAGE ForeignFunctionInterface #-}
import Foreign.C.String (CString, newCString)
import Foreign.ForeignPtr (newForeignPtr)
import Foreign.Ptr (FunPtr)
foreign import ccall "&puts" puts :: FunPtr (CString -> IO ())
main :: IO ()
main = do
putStrLn "start"
message <- newCString "a was \"deleted\""
a <- newForeignPtr puts message
putStrLn "end"
出力:
start
end
a was "deleted"