Memory 释放用newCString分配的内存
正如图书馆文档所说,使用Memory 释放用newCString分配的内存,memory,haskell,memory-management,ffi,Memory,Haskell,Memory Management,Ffi,正如图书馆文档所说,使用newCString创建的CString必须使用free函数释放。我一直期望当CString被创建时,它会占用一些内存,当它被free释放时,内存使用率会下降,但它没有!下面是示例代码: module Main where import Foreign import Foreign.C.String import System.IO wait = do putStr "Press enter" >> hFlush stdout _ <- ge
newCString
创建的CString
必须使用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)
modulemain其中
进口国外
输入外文字符串
导入系统.IO
等待=做
PUTSR“按回车键”>>hFlush标准输出
_问题在于free
只是向垃圾收集器指示它现在可以收集字符串。但这实际上并不强制垃圾收集器运行——它只是指示CString现在是垃圾。根据堆压力启发法,何时运行仍由GC决定
您可以在调用free
后直接调用performGC
强制执行主要收集,这会立即将内存减少到5M左右
例如,该计划:
import Foreign
import Foreign.C.String
import System.IO
import System.Mem
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
performGC
wait -- (2)
导入外文
输入外文字符串
导入系统.IO
导入系统.Mem
等待=做
PUTSR“按回车键”>>hFlush标准输出
_您使用的是哪个版本的GHC?向操作系统返回内存的功能仅在去年才添加到GHC中。GHC--version
outputsGlasgow Haskell编译系统,7.4.1版
非常感谢。我不知道ghc中的malloc
/free
是这样工作的。我尝试了performGC
,它确实有效。这个问题是在我测试绑定到某个C库的效果时出现的。我用大量的C字符串测试了它们,惊讶地发现内存没有释放。现在这个谜团似乎已经解开了)我想我无法反驳你的证据,即performGC
确实有效,但这就是我一直认为答案的原因,直到我去看了-,在我看来free
确实调用了C函数free()
。这是如何与GC交互的?我怀疑这是因为在GC运行之前,内存实际上没有从GHC rts池释放到操作系统。因此,您可以重用Haskell提供的内存块,但它还没有返回给操作系统。但malloc和free肯定根本不使用rts池,它们直接使用系统内存?