正如库文档所说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 左右——这没关系。我按回车,程序在第 (2) 行停止,但内存使用量仍然是 410M,尽管cs
已经free
d!
这怎么可能?用 C 编写的类似程序的行为应如此。我在这里想念什么?