Als Bibliotheksdokumente sagen CString
erstellt mit newCString
muss mit free
Funktion freigegeben werden. Ich habe erwartet, dass, wenn CString
erstellt wird, würde es einige Speicher benötigen und wenn es mit free
freigegeben wird Speicherverbrauch würde sinken, aber es hat nicht! Es folgt ein Beispielcode:Freigeben von Speicher, der mit newCString belegt ist
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)
Wenn das Programm hielt an (1), htop
Programm zeigte, dass die Speichernutzung irgendwo um 410M ist - das ist OK. Ich drücke Enter und das Programm stoppt bei Zeile (2), aber Speicherverbrauch ist immer noch 410M trotz cs
wurde free
d!
Wie ist das möglich? Ein ähnliches in C geschriebenes Programm verhält sich wie es sollte. Was fehlt mir hier?
Welche Version von GHC verwenden Sie? Die Möglichkeit, Speicher an das Betriebssystem zurückzugeben, wurde erst letztes Jahr zu GHC hinzugefügt. –
'ghc --version' Ausgaben' The Glorious Glasgow Haskell Compilation System, Version 7.4.1' –