मैं इसे इस तरह से करने के दो कारणों के बारे में सोच सकता हूं, जिनमें से कोई भी आकर्षक नहीं लगता है।
कारण 1: गारंटी नहीं है कि संदर्भ शून्य से कोई अपवाद उठाया है
कार्यान्वयन इस को प्राप्त होता है पर सेट है। यदि विनाशक उठता है, तो संदर्भ अभी भी शून्य पर सेट है। एक और तरीका है ऐसा करने के लिए एक finally
ब्लॉक के साथ होगा:
try
TObject(Obj).Free;
finally
TObject(Obj) := nil;
end;
इस का नकारात्मक पहलू प्रदर्शन है। विशेष रूप से x86 पर try/finally
थोड़ा महंगा है। इस तरह के मौलिक दिनचर्या में इस खर्च से बचने के लिए समझदारी है।
मुझे हर कीमत पर मजबूर होने की इच्छा क्यों मिलती है? खैर, जैसे ही विनाशक विफल होने लगते हैं, आप भी हार मान सकते हैं। अब आप अपने कार्यक्रम के राज्य के बारे में स्पष्ट रूप से कारण नहीं बना सकते हैं। आप यह नहीं बता सकते कि क्या असफल रहा और आपका कार्यक्रम किस राज्य में है। यह मेरा विचार है कि एक विनाशक के चेहरे पर कार्रवाई का सही तरीका प्रक्रिया को समाप्त करना है।
कारण 2: सुनिश्चित करने के लिए अन्य सूत्र का पता लगा सकते है कि उस वस्तु को नष्ट कर दिया जा रहा है
फिर इस हासिल की है, लेकिन यह कोई व्यावहारिक उपयोग की है। हां आप जांच सकते हैं कि संदर्भ असाइन किया गया है या नहीं। लेकिन फिर क्या? अन्य धागा बिना सिंक्रनाइज़ेशन के ऑब्जेक्ट पर विधियों को कॉल नहीं कर सकता है। आप जो कुछ भी कर सकते हैं वह यह जानना है कि वस्तु जीवित है या नहीं। और यदि ऐसा है, तो यह क्यों मायने रखता है कि यह स्थिति विनाशक के पहले या बाद में बदल जाती है?
तो जब तक मैं इसे एक संभावित कारण के रूप में प्रस्तुत करता हूं, मुझे विश्वास नहीं है कि एम्बरकेडरो में कोई भी वास्तव में इस तर्क से प्रभावित हुआ था।
स्रोत
2014-10-29 07:56:17
मैं केवल यह सुनिश्चित करने के लिए मानता हूं कि यह 'शून्य' हो जाता है भले ही 'फ्री' ने किसी प्रकार का अपवाद उठाया हो। –
यदि आप स्विच करते हैं और विनाशक अपवाद उठाता है, तो आपको एक बासी पॉइंटर के साथ छोड़ दिया जाता है। Wether आपको FreeAndNil का उपयोग करना चाहिए, आप इसे यहां पढ़ सकते हैं [http://www.nickhodges.com/post/Using-FreeAndNil.aspx) और अपने स्वयं के निष्कर्ष निकालें। –
अन्य संभावित धागे को इंगित करने के लिए पहले ऑब्जेक्ट मौजूद नहीं है। यदि आप आदेश को स्वैप करते हैं, नि: शुल्क और शून्य असाइनमेंट के बीच कोई अन्य थ्रेड अमान्य पॉइंटर को संदर्भित कर सकता है। – pf1957