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
outputs
Glasgow Haskell编译系统,7.4.1版
非常感谢。我不知道ghc中的
malloc
/
free
是这样工作的。我尝试了
performGC
,它确实有效。这个问题是在我测试绑定到某个C库的效果时出现的。我用大量的C字符串测试了它们,惊讶地发现内存没有释放。现在这个谜团似乎已经解开了)我想我无法反驳你的证据,即
performGC
确实有效,但这就是我一直认为答案的原因,直到我去看了-,在我看来
free
确实调用了C函数
free()
。这是如何与GC交互的?我怀疑这是因为在GC运行之前,内存实际上没有从GHC rts池释放到操作系统。因此,您可以重用Haskell提供的内存块,但它还没有返回给操作系统。但malloc和free肯定根本不使用rts池,它们直接使用系统内存?