निम्नलिखित कोड, पता चलता है कि जब runhaskell
हास्केल कचरा कलेक्टर का उपयोग कर स्मृति विज्ञप्ति जब a
नहीं रह गया है प्रयोग किया जाता है कैसे कर सकते हैं। इसके परिणामस्वरूप कोर डंप में परिणाम a
जारी करते हैं - एक उद्देश्य के लिए, व्यवहार का निरीक्षण करने के लिए - a
को nullFunPtr
को अंतिमकर्ता के रूप में मिला है।
module Main where
import Foreign.Ptr
import Foreign.ForeignPtr
main :: IO()
main = do
a <- newForeignPtr nullFunPtr nullPtr
putStrLn "Hello World"
समस्या
जब GHCi यह स्मृति जारी नहीं करता है में एक ही चल रहा है। मैं ghci को अब उपयोग किए जाने वाले चर को रिलीज़ करने के लिए कैसे मजबूर कर सकता हूं?
$ ghci
> import Foreign.Ptr
> import Foreign.ForeignPtr
> import System.Mem
> a <- newForeignPtr nullFunPtr nullPtr
> a <- return() -- rebinding variable a to show gc that I'm no longer using it
> performGC
> -- did not crash - GC didn't release memory
> ^D
Leaving GHCi.
[1] 4396 segmentation fault (core dumped) ghci
मेमोरी बाहर निकलने पर जारी किया गया था, लेकिन यह मेरे लिए बहुत देर हो चुकी है। मैं जीएचसीआई का विस्तार कर रहा हूं और इसे अन्य उद्देश्यों के लिए उपयोग कर रहा हूं और मुझे पहले से ही स्मृति को रिलीज करने की आवश्यकता है - मांग पर या जितनी जल्दी हो सके उतनी जल्दी होगी।
मुझे पता है कि मैं finalizeForeignPtr
पर कॉल कर सकता हूं, लेकिन मैं केवल डीबग उद्देश्यों के लिए foreignPtr
का उपयोग कर रहा हूं। मैं पिछले उदाहरण में सामान्य रूप से a
कैसे जारी कर सकता हूं?
यदि ghci प्रॉम्प्ट के साथ ऐसा करने की कोई संभावना नहीं है, तो मैं ghci
कोड भी संशोधित कर सकता हूं। हो सकता है कि मैं a
को modyfing ghci Interactive Context या DynFlags द्वारा रिलीज़ कर सकता हूं? अब तक मुझे अपने रीसेसर के साथ कोई भाग्य नहीं मिला है।
क्या आप सुनिश्चित हैं कि स्मृति जारी नहीं है? मुझे नहीं लगता कि एक गारंटी है कि एक चर वैरिएबल होने पर फाइनल तुरंत चलते हैं। –
इसके बजाए, मैंने बड़े सरणी के साथ समान परीक्षण किए और 'ekg' के साथ इसकी निगरानी की। कुछ भी जारी नहीं किया गया था। – remdezx
'()' के पुनर्मूल्यांकन के बाद एकत्रित कचरा क्यों होना चाहिए? Ghci कैसे पता चलेगा (एक तरह के आईओ monad के अंदर से) की आवश्यकता नहीं होगी? –