समस्या को समझाने में काफी आसान है, और इस मुद्दे के आसपास की विवाद उद्देश्य से अधिक व्यक्तिपरक है। दिए गए कारण के लिए,
procedure Test;
var
LObj: TObject;
begin
LObj := TObject.Create;
try
{...Do work...}
finally
//The LObj variable is going out of scope here,
// so don't bother nilling it. No other code can access LObj.
//FreeAndNil(LObj);
LObj.Free;
end;
end;
ऊपर कोड स्निपेट में, nilling LObj
चर व्यर्थ होगा: FreeAndNil के उपयोग के बस अनावश्यक अगर वस्तु मुक्त कर दिया जा रहा है चर संदर्भ क्षेत्र से बाहर जाना होगा है। हालांकि, यदि किसी ऑब्जेक्ट वैरिएबल को एप के जीवनकाल के दौरान कई बार तत्काल और मुक्त किया जा सकता है, तो यह जांचना आवश्यक हो जाता है कि ऑब्जेक्ट वास्तव में तत्काल है या नहीं। यह जांचने का आसान तरीका यह है कि ऑब्जेक्ट संदर्भ nil
पर सेट किया गया है या नहीं। nil
पर सेटिंग को सुविधाजनक बनाने के लिए, FreeAndNil()
विधि दोनों संसाधनों को मुक्त करेगी, और आपके लिए nil
सेट करेंगी।फिर, कोड में आप यह देखने के लिए जांच सकते हैं कि ऑब्जेक्ट LObj = nil
या Assigned(LObj)
के साथ तत्काल है या नहीं।
कि क्या वस्तु विनाशकर्ता में .Free
या FreeAndNil()
उपयोग करने के लिए के मामले एक ग्रे क्षेत्र है, लेकिन अधिकांश भाग के लिए, .Free
सुरक्षित होना चाहिए, और नाशक में उप वस्तुओं के लिए संदर्भ nilling अनावश्यक होना चाहिए। रचनाकारों और विनाशकों में अपवादों से निपटने के तरीके के बारे में विभिन्न तर्क हैं।
अब ध्यान देना: यदि आप ले सकते हैं और कि क्या .Free
या FreeAndNil()
ऊपर उल्लिखित विशिष्ट परिस्थितियों के आधार पर उपयोग करने के लिए, यह ठीक है चुनते हैं, लेकिन ध्यान दें कि एक बग की लागत की वजह से नहीं एक मुक्त कर दिया ऑब्जेक्ट संदर्भ nilling करना पसंद करते हैं बाद में इसका उपयोग किया जा सकता है बहुत अधिक हो सकता है। यदि पॉइंटर को बाद में एक्सेस किया जाता है (ऑब्जेक्ट मुक्त हो जाता है लेकिन संदर्भ शून्य पर सेट नहीं होता है), तो ऐसा हो सकता है कि आप दुर्भाग्यपूर्ण हैं और स्मृति भ्रष्टाचार का पता लगाना कोड की कई पंक्तियों को मुक्त-लेकिन-रहित ऑब्जेक्ट संदर्भ तक पहुंच से दूर करता है। इस प्रकार की बग को ठीक करने में बहुत लंबा समय लग सकता है, और हाँ, मुझे पता है कि फास्टएमएम का उपयोग कैसे करें।
इसलिए मेरे साथ कुछ लोगों के लिए, यह आदत बनने के लिए आदत (आलसी एक, शायद) बन गई है, जब वे मुक्त हो जाते हैं, भले ही न तो सख्ती से जरूरी हो।
स्रोत
2010-08-18 10:53:30
आप एक अच्छा सवाल यहाँ पूछा। – Ampere