Vì tài liệu thư viện nói CString
được tạo với newCString
phải được giải phóng với chức năng free
. Tôi đã mong đợi rằng khi CString
được tạo ra nó sẽ mất một số bộ nhớ và khi nó được phát hành với sử dụng bộ nhớ free
sẽ đi xuống, nhưng nó đã không! Dưới đây là mã ví dụ:Giải phóng bộ nhớ được phân bổ với 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)
Khi chương trình dừng lại ở (1), htop
chương trình cho thấy rằng việc sử dụng bộ nhớ là ở đâu đó xung quanh 410M - đây là OK. Tôi nhấn enter và chương trình dừng lại ở dòng (2), nhưng mức sử dụng bộ nhớ vẫn là 410M mặc dù cs
là free
d!
Làm cách nào có thể? Chương trình tương tự được viết bằng C hoạt động như mong muốn. Tôi đang thiếu gì ở đây?
Bạn đang sử dụng phiên bản GHC nào? Khả năng trả lại bộ nhớ cho hệ điều hành chỉ được thêm vào GHC vào năm ngoái. –
Đầu ra 'ghc --version'' Hệ thống biên dịch Glorious Glasgow Haskell, phiên bản 7.4.1' –