Come i documenti della biblioteca dicono che CString
creato con newCString
deve essere liberato con la funzione free
. Mi aspettavo che quando è stato creato CString
ci sarebbe voluto un po 'di memoria e quando è stato rilasciato con free
l'utilizzo della memoria sarebbe andato giù, ma non è così! Ecco codice di esempio:Liberare memoria allocata 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)
Quando il programma si fermò a (1), htop
programma ha dimostrato che l'utilizzo della memoria è da qualche parte intorno a 410M - questo è OK. Premo invio e il programma si ferma alla riga (2), ma l'utilizzo della memoria è ancora 410M nonostante sia stato free
d!
Com'è possibile? Programma simile scritto in C si comporta come dovrebbe. Cosa mi manca qui?
Quale versione di GHC stai utilizzando? La possibilità di restituire memoria al sistema operativo è stata aggiunta a GHC solo l'anno scorso. –
'ghc --version' restituisce' The Glorious Glasgow Haskell Compilation System, versione 7.4.1' –