Как говорят документы библиотеки CString
, созданные с помощью newCString
, должны быть освобождены с помощью функции 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)
Когда программа остановилась на (1), программа htop
показала, что использование памяти составляет около 410M - это нормально. Я нажимаю enter, и программа останавливается в строке (2), но использование памяти по-прежнему составляет 410M, несмотря на то, что cs
был free
d!
Как это возможно? Подобная программа, написанная на C, ведет себя так, как должна. Что мне здесь не хватает?