Como los documentos de la biblioteca dicen CString
creados con newCString
deben liberarse con la función free
. He estado esperando que cuando se crea CString
se necesitaría algo de memoria y cuando se lance con free
el uso de la memoria disminuirá, ¡pero no fue así! Aquí es código de ejemplo:Liberar memoria asignada con newCString
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)
Cuando el programa se detuvo en (1), programa de htop
mostró que el uso de memoria es de alrededor de 410M - esto está bien. Presiono enter y el programa se detiene en la línea (2), pero el uso de memoria sigue siendo 410M a pesar de que cs
ha sido free
d!
¿Cómo es esto posible? El programa similar escrito en C se comporta como debería. ¿Que me estoy perdiendo aqui?
¿Qué versión de GHC estás utilizando? La capacidad de devolver memoria al sistema operativo solo se agregó a GHC el año pasado. –
'ghc --version' outputs' The Glorious Glasgow Haskell Compilation System, versión 7.4.1' –