ライブラリのドキュメントが言うようにCString
、作成されたものは関数newCString
で解放する必要がありfree
ます。CString
作成時にメモリが必要で、リリース時にメモリ使用量が減少することを期待していましfree
たが、そうではありませんでした! コード例は次のとおりです。
module Main where
import Foreign
import Foreign.C.String
import System.IO
wait = do
putStr "Press enter" >> hFlush stdout
_ <- getLine
return ()
main = do
let s = concat $ replicate 1000000 ['0'..'9']
cs <- newCString s
cs `seq` wait -- (1)
free cs
wait -- (2)
プログラムが (1) で停止したとき、htop
プログラムはメモリ使用量が約 410M であることを示しました - これは問題ありません。Enter キーを押すと、プログラムは行 (2) で停止しますが、dcs
が実行されたにもかかわらず、メモリ使用量はまだ 410M です!free
これはどのように可能ですか?C で書かれた同様のプログラムは、本来の動作をします。ここで何が欠けていますか?