के साथ आवंटित स्मृति को मुक्त करने के रूप में लाइब्रेरी दस्तावेज़ 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
कार्यक्रम से पता चला कि स्मृति के उपयोग 410M के आसपास कहीं है बंद कर दिया - यह ठीक है। मैं एंटर दबाता हूं और प्रोग्राम लाइन (2) पर रुक जाता है, लेकिन cs
के बावजूद मेमोरी उपयोग अभी भी 410 एम है free
डी!
यह कैसे संभव है? सी में लिखे गए इसी तरह के कार्यक्रम के रूप में व्यवहार करना चाहिए। मुझे यहां क्या समझ नहीं आ रहा है?
जीएचसी का कौन सा संस्करण आप उपयोग कर रहे हैं? ओएस में मेमोरी वापस करने की क्षमता पिछले साल जीएचसी में ही जुड़ी थी। –
'ghc --version' outputs 'शानदार ग्लासगो हास्केल संकलन प्रणाली, संस्करण 7.4.1' –