2010-06-24 14 views
14

इस उदाहरणक्या गतिशील सरणी स्वचालित रूप से तब तक समाप्त हो जाती है जब यह दायरे से बाहर हो जाती है?

procedure foobar; 
var tab:array of integer; 
begin 
    setlength(tab,10); 
end; 

में सरणी को नष्ट कर दिया है या स्मृति लीक कर रहा है?

+0

हालांकि यह रिसाव नहीं हो सकता है, तो आपको वास्तव में अपने स्वयं के चर मुक्त करना चाहिए। सेटलेथेंथ (टैब, 0) करें; यह एक अतिरिक्त रेखा है। यदि आप इसके बारे में चिंतित हैं तो इसे एक कोशिश/अंत में ब्लॉक में लपेटें। –

+2

मैं उस सलाह का समर्थन नहीं कर सकता, @ रयान। क्या आप अपने सभी स्ट्रिंग चर मैन्युअल रूप से भी साफ़ करते हैं? जब मैं वेरिएबल्स को मान असाइन करने वाले कोड देखता हूं जिन्हें कभी भी दोबारा उपयोग नहीं किया जाता है, तो यह मुझे बताता है कि प्रोग्रामर वास्तव में यह नहीं समझता कि भाषा कैसे काम करती है। विशेष रूप से, संकलक पहले से ही फ़ंक्शन बॉडी के चारों ओर एक कोशिश-अंतराल ब्लॉक रखता है ताकि यह सुनिश्चित किया जा सके कि गतिशील-सरणी चर साफ़ हो जाए। अपने आप में से एक में रखना overkill है। –

+0

@ रयान, यह सिर्फ गलत है। SetLength पर कॉल कुल कचरा है, दोनों कीस्ट्रोक और रनटाइम पर एक अनावश्यक फ़ंक्शन कॉल। गतिशील सरणी कंपाइलर द्वारा प्रबंधित की जाती हैं, और जब वे दायरे से बाहर निकलती हैं तो उन्हें स्वचालित रूप से मुक्त कर दिया जाएगा। –

उत्तर

14

स्मृति मुक्त हो गई है। (यानी, कोई स्मृति रिसाव नहीं है!)

+4

तत्वों को भी मुक्त किया जाता है यदि उनको संकलक द्वारा प्रबंधित किया जाता है (dyn arrays, तार, intf, ऐसे प्रकार के रिकॉर्ड और इसी तरह)। – alex

+1

"टैब: इंटीजर की सरणी" के लिए, सबकुछ मुक्त हो गया है। "टैब: टॉब्जेक्ट की सरणी", या किसी अन्य वर्ग के लिए, आपको ऑब्जेक्ट्स को स्वयं मुक्त करना होगा। –

+0

सच है, @ वॉरेन, लेकिन इसका सरणी से कोई लेना देना नहीं है। एक ही सलाह एक सामान्य स्केलर पर लागू होती है। वस्तुओं को मुक्त करने की जरूरत है; पूर्णांक नहीं करते हैं। –

1

सरणी स्वचालित रूप से मुक्त हो जाती है, लेकिन मैंने अस्पष्ट मामलों को देखा है जहां यह किसी कारण से नहीं है। मैंने सरणी को शून्य पर सेट करके हल किया।

+6

केवल दो कारण हैं कि इसे मुक्त नहीं किया जाएगा। या तो आप पॉइंटर्स के साथ कुछ डरावना कर रहे हैं जो संदर्भ गिनती को गड़बड़ कर देता है, या सरणी का स्वामित्व किसी ऑब्जेक्ट या रिकॉर्ड के स्वामित्व में होता है जो लीक भी होता है। –

+0

मुझे पता है, किसी भी तरह से यह कुछ और था जिससे ऑटो-फ्री नहीं हुआ। काश मैं अभी भी साबित करने के लिए उदाहरण था! लेकिन मैं नहीं करता। –

+0

यह कंपाइलर के कोड-जेन में एक बग होगा। या शायद यह एक धागा था? सहायता स्पष्ट रूप से बताती है कि थ्रेडवर्स के रूप में उपयोग किए जाने वाले प्रबंधित प्रकार स्वचालित रूप से स्वयं को मुक्त नहीं करेंगे और आपको मैन्युअल रूप से ऐसा करने की आवश्यकता है। –

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

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