2012-05-18 15 views
10

मैं हाल ही में कुछ कोड देख रहा था जो बाइट्स की सरणी के लिए स्मृति आवंटित करने के लिए SetLength का उपयोग करता है, लेकिन मुझे उस मेमोरी स्पेस को रिलीज़ करने के लिए कोई तर्क नहीं दिख रहा था। मैंने पढ़ा है कि बाइट्स की एक सरणी के लिए आपको या तो मान को शून्य पर सेट करना चाहिए या अंतिम रूप देना चाहिए?डेल्फी में SetLength() का उपयोग करते समय, उस स्मृति को हटाने का सही तरीका क्या है?

क्या,

var 
    x: array of byte; 
begin 
    SetLength(x, 30); 
    // Do something here 
    : 
    // Release the array 
    x := nil; 
    Finalize(x); 
end; 

उत्तर

23

आम तौर पर सबसे अच्छा तरीका यह है ... मैं क्या मिला तो वह ऐसा कुछ पता चलता है के आधार पर संभाल करने के लिए है ... आप सब पर स्मृति को मुक्त करने की जरूरत नहीं है, चूंकि यह पहचानकर्ता स्वचालित रूप से किया जाता है (इस मामले में, x) दायरे से बाहर चला जाता है। इसलिए, आपके कोड में दो अंतिम पंक्तियां पूरी तरह से व्यर्थ हैं।

यदि, हालांकि, आपके पास एक पहचानकर्ता है जो कहता है कि आपका प्रोग्राम बंद हो रहा है, तब तक आप दायरे से बाहर नहीं जाते हैं, तो आप इसके साथ जुड़े स्मृति को मैन्युअल रूप से मुक्त करना चाहेंगे। विशेष रूप से, यदि आप पहचानकर्ता एक बड़ी बिटमैप छवि या ऐसा कुछ है तो आप ऐसा करना चाहेंगे। फिर आप x := nil, SetLength(x, 0) या ऐसा कुछ कर सकते हैं।

9

गतिशील सरणी प्रबंधित प्रकार हैं। इसका मतलब यह है कि जब संकलक सरणी का अंतिम संदर्भ गुंजाइश से बाहर हो जाता है तो संकलक स्मृति का निपटान करेगा। इसका मतलब है कि आपके कोड में सरणी को मुक्त करने के लिए कोड बल्कि व्यर्थ है।

आप, आप कोड के इन बराबर लाइनों में से किसी का उपयोग करके समय से आगे सरणी पुनःआवंटन कर सकते हैं करने के लिए की जरूरत है:

SetLength(x, 0); 
Finalize(x); 
x := nil; 

सावधान रहें कि यदि आप एक ही सरणी के लिए एकाधिक संदर्भ हो तो आप क्या करने की जरूरत यह उस सरणी के सभी संदर्भों के लिए है।

संबंधित मुद्दे