Как сообщает библиотека docs CString
, созданная с помощью newCString
, должна быть освобождена с помощью функции free
. Я ожидал, что при создании CString
потребуется немного памяти, и когда он будет выпущен с free
, использование памяти снизится, но это не так! Вот пример кода:Освобождение памяти, выделенной с помощью 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)
Когда программа остановилась на (1), htop
программа показала, что использование памяти где-то около 410м - это нормально. Я нажимаю enter, и программа останавливается на линии (2), но использование памяти по-прежнему составляет 410M, несмотря на то, что cs
был free
d!
Как это возможно? Подобная программа, написанная на C, ведет себя так, как должна. Что мне здесь не хватает?
Какая версия GHC вы используете? Возможность вернуть память в ОС была добавлена только в GHC в прошлом году. –
'ghc --version' выходы' Славная система компиляции Haskell Glasgow, версия 7.4.1' –