फ़ाइनलाइज़र: Difference between revisions

From Vigyanwiki
No edit summary
No edit summary
Line 1: Line 1:
{{for|the video game|Finalizer (video game)}}
{{for|वीडियो गेम|फाइनलाइज़र (वीडियो गेम)}}
{{for|the process related to optical disc media|Finalize (optical discs)}}
{{for|ऑप्टिकल डिस्क मीडिया से संबंधित प्रक्रिया|फाइनलाइज (ऑप्टिकल डिस्क)}}
[[कंप्यूटर विज्ञान]] में,  फाइनलाइज़र या अंतिम विधि एक विशेष [[विधि (कंप्यूटर प्रोग्रामिंग)]] है जो अंतिम रूप देती है, आम तौर पर सफाई का कुछ रूप। वस्तु के विनाश के दौरान फाइनलाइज़र को निष्पादित किया जाता है, [[वस्तु निर्माण]] [[आवंटन रद्द]] से पहले, और  [[प्रारंभकर्ता]] का पूरक होता है, जिसे मेमोरी प्रबंधन के बाद ऑब्जेक्ट निर्माण के दौरान निष्पादित किया जाता है। उचित उपयोग में कठिनाई और उनके द्वारा जोड़ी जाने वाली जटिलता के कारण फ़ाइनलाइज़र को कुछ लोगों द्वारा दृढ़ता से हतोत्साहित किया जाता है, और इसके बजाय विकल्प सुझाए जाते हैं, मुख्य रूप से [[निपटान पैटर्न]]<ref>{{harvnb|Jagger|Perry|Sestoft|2007|p=[https://books.google.com/books?id=g6axWRRpJZwC&dq=destructor+finalizer&pg=PA542 542]|ps=, "In C++, a destructor is called in a determinate manner, whereas, in [[C Sharp (programming language)|C#]], a finalizer is not. To get determinate behavior from C#, one should use <code>Dispose.</code>}}</ref> (#समस्याएं देखें)
[[कंप्यूटर विज्ञान]] में,  फाइनलाइज़र या अंतिम विधि एक विशेष [[विधि (कंप्यूटर प्रोग्रामिंग)]] है | जो अंतिम रूप देती है | सामान्यतः सफाई का कुछ रूप ऑब्जेक्ट के विनाश के समय फाइनलाइज़र को निष्पादित किया जाता है | [[वस्तु निर्माण|ऑब्जेक्ट निर्माण]] से पहले, और  [[प्रारंभकर्ता]] का पूरक होता है | जिसे मेमोरी प्रबंधन के बाद ऑब्जेक्ट निर्माण के समय निष्पादित किया जाता है। उचित उपयोग में कठिनाई और उनके द्वारा जोड़ी जाने वाली जटिलता के कारण फ़ाइनलाइज़र को कुछ लोगों द्वारा दृढ़ता से हतोत्साहित किया जाता है, और इसके अतिरिक्त विकल्प सुझाए जाते हैं | मुख्य रूप से [[निपटान पैटर्न|डिस्पोजल पैटर्न]] <ref>{{harvnb|Jagger|Perry|Sestoft|2007|p=[https://books.google.com/books?id=g6axWRRpJZwC&dq=destructor+finalizer&pg=PA542 542]|ps=, "In C++, a destructor is called in a determinate manner, whereas, in [[C Sharp (programming language)|C#]], a finalizer is not. To get determinate behavior from C#, one should use <code>Dispose.</code>}}</ref> (समस्याएं देखें) है।


फ़ाइनलाइज़र शब्द का उपयोग ज्यादातर [[ ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग ]] में किया जाता है। ऑब्जेक्ट-ओरिएंटेड और [[ कार्यात्मक प्रोग्रामिंग ]] [[ प्रोग्रामिंग भाषा ]] जो कचरा संग्रह (कंप्यूटर साइंस) का उपयोग करती हैं, जिनमें से मूलरूप स्मॉलटाक है। यह  [[ विनाशक (कंप्यूटर प्रोग्रामिंग) ]] के विपरीत है, जो नियतात्मक रूप से [[C++]] के नियतात्मक वस्तु जीवनकाल के साथ भाषाओं में अंतिम रूप देने के लिए कहा जाने वाला  तरीका है।<ref>{{cite conference |last=Boehm |first=Hans-J. |year=2002 |title=विध्वंसक, अंतिम रूप देने वाले और तुल्यकालन|url=http://www.hpl.hp.com/techreports/2002/HPL-2002-335.html |conference=[[Symposium on Principles of Programming Languages]] (POPL)}}</ref><ref>{{harvnb|Jagger|Perry|Sestoft|2007|p=[https://books.google.com/books?id=g6axWRRpJZwC&dq=destructor+finalizer&pg=PA542 542]|ps=, '''C++ destructors versus C# finalizers''' C++ destructors are determinate in the sense that they are run at known points in time, in a known order, and from a known thread. They are thus semantically ''very'' different from C# finalizers, which are run at unknown points in time, in an unknown order, from an unknown thread, and at the discretion of the garbage collector.}}</ref> ये आम तौर पर अनन्य होते हैंभाषा में या तो फ़ाइनलाइज़र (यदि स्वचालित रूप से कचरा एकत्र किया जाता है) या विध्वंसक (यदि मैन्युअल रूप से मेमोरी प्रबंधित की जाती है), लेकिन दुर्लभ मामलों में  भाषा में C++/CLI और D (प्रोग्रामिंग लैंग्वेज) और दोनों हो सकते हैं। [[संदर्भ गिनती]] का मामला (कचरा संग्रह का पता लगाने के बजाय), शब्दावली भिन्न होती है। तकनीकी उपयोग में, डिस्ट्रक्टर्स को संदर्भित करने के लिए फाइनलाइज़र का भी उपयोग किया जा सकता है, क्योंकि ये भी अंतिम रूप देते हैं, और कुछ सूक्ष्म भेद तैयार किए जाते हैं - #Terminology देखें। अंतिम शब्द का उपयोग उस वर्ग को इंगित करने के लिए भी किया जाता है जो वंशानुक्रम (ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग) नहीं हो सकता है; यह असंबंधित है।
फ़ाइनलाइज़र शब्द का उपयोग अधिकतर [[ ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग ]] में किया जाता है। ऑब्जेक्ट-ओरिएंटेड और [[ कार्यात्मक प्रोग्रामिंग ]] [[ प्रोग्रामिंग भाषा ]] जो कचरा संग्रह (कंप्यूटर साइंस) का उपयोग करती हैं | जिनमें से मूलरूप स्मॉलटाक है। यह  [[ विनाशक (कंप्यूटर प्रोग्रामिंग) ]] के विपरीत है | जो नियतात्मक रूप से [[C++]] के नियतात्मक ऑब्जेक्ट जीवनकाल के साथ भाषाओं में अंतिम रूप देने के लिए कहा जाने वाला  विधि है।<ref>{{cite conference |last=Boehm |first=Hans-J. |year=2002 |title=विध्वंसक, अंतिम रूप देने वाले और तुल्यकालन|url=http://www.hpl.hp.com/techreports/2002/HPL-2002-335.html |conference=[[Symposium on Principles of Programming Languages]] (POPL)}}</ref><ref>{{harvnb|Jagger|Perry|Sestoft|2007|p=[https://books.google.com/books?id=g6axWRRpJZwC&dq=destructor+finalizer&pg=PA542 542]|ps=, '''C++ destructors versus C# finalizers''' C++ destructors are determinate in the sense that they are run at known points in time, in a known order, and from a known thread. They are thus semantically ''very'' different from C# finalizers, which are run at unknown points in time, in an unknown order, from an unknown thread, and at the discretion of the garbage collector.}}</ref> ये सामान्यतः अनन्य होते हैं | भाषा में या तो फ़ाइनलाइज़र (यदि स्वचालित रूप से कचरा एकत्र किया जाता है) या विध्वंसक (यदि मैन्युअल रूप से मेमोरी प्रबंधित की जाती है), किन्तु दुर्लभ स्थितियों में  भाषा में C++/CLI और D (प्रोग्रामिंग लैंग्वेज) और दोनों हो सकते हैं। [[संदर्भ गिनती|संदर्भ गणना]] का स्थिति (कचरा संग्रह का पता लगाने के अतिरिक्त), शब्दावली अलग होती है। विधि उपयोग में, डिस्ट्रक्टर्स को संदर्भित करने के लिए फाइनलाइज़र का भी उपयोग किया जा सकता है | क्योंकि ये भी अंतिम रूप देते हैं, और कुछ सूक्ष्म भेद तैयार किए जाते हैं | शब्दावली देखें अंतिम शब्द का उपयोग उस वर्ग को इंगित करने के लिए भी किया जाता है | जो वंशानुक्रम (ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग) नहीं हो सकता है | यह असंबंधित है।


'''क्योंकि ये भी अंतिम रूप देते हैं, और कुछ सूक्ष्म भेद तैयार किए जाते हैं - #Terminology देखें। अंतिम शब्द का उपयोग उस वर्ग को इंगित करने के लिए भी किया जाता है जो वंशानुक्रम (ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग) नहीं हो सकता है; यह असंबंधित है।क्योंकि ये भी अंतिम रूप देते हैं, और'''
'''क्योंकि ये भी अंतिम रूप देते हैं, और कुछ सूक्ष्म भेद तैयार किए जाते हैं - #शब्दावली देखें। अंतिम शब्द का उपयोग उस वर्ग को इंगित करने के लिए भी किया जाता है जो वंशानुक्रम (ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग) नहीं हो सकता है; यह असंबंधित है।क्योंकि ये भी अंतिम रूप देते हैं, और'''


== शब्दावली ==
== शब्दावली ==
फाइनलाइज़र और फ़ाइनलाइज़ेशन बनाम विध्वंसक और विनाश की शब्दावली लेखकों के बीच भिन्न होती है और कभी-कभी अस्पष्ट होती है।
फाइनलाइज़र और फ़ाइनलाइज़ेशन बनाम विध्वंसक और विनाश की शब्दावली लेखकों के बीच अलग होती है और कभी-कभी अस्पष्ट होती है।


सामान्य उपयोग में,  विध्वंसक एक विधि है जिसे नियतात्मक रूप से वस्तु के विनाश पर कहा जाता है, और मूलरूप सी ++ विध्वंसक है; जबकि  फाइनलाइज़र को कचरा कलेक्टर द्वारा गैर-नियतात्मक रूप से कहा जाता है, और मूलरूप [[जावा (प्रोग्रामिंग भाषा)]] है <code>finalize</code> तरीके।
सामान्य उपयोग में,  विध्वंसक एक विधि है | जिसे नियतात्मक रूप से ऑब्जेक्ट के विनाश पर कहा जाता है, और मूलरूप C++ विध्वंसक है | जबकि  फाइनलाइज़र को कचरा कलेक्टर द्वारा गैर-नियतात्मक रूप से कहा जाता है, और मूलरूप [[जावा (प्रोग्रामिंग भाषा)]] <code>finalize</code> को अंतिम रूप देने के तरीके है |


उन भाषाओं के लिए जो संदर्भ गिनती के माध्यम से कचरा संग्रह को लागू करती हैं, शब्दावली भिन्न होती है, कुछ भाषाओं जैसे [[ उद्देश्य सी ]] और [[पर्ल]] डिस्ट्रक्टर का उपयोग करते हुए, और अन्य भाषाओं जैसे कि पायथन फ़ाइनलाइज़र का उपयोग करते हुए (प्रति युक्ति, पायथन कचरा एकत्र किया जाता है, लेकिन संदर्भ [[CPython]] कार्यान्वयन इसके बाद से संस्करण 2.0 संदर्भ गिनती और कचरा संग्रह के संयोजन का उपयोग करता है)। यह दर्शाता है कि संदर्भ गणना का परिणाम अर्ध-नियतात्मक वस्तु जीवनकाल में होता है: उन वस्तुओं के लिए जो  चक्र का हिस्सा नहीं हैं, वस्तुओं को निश्चित रूप से नष्ट कर दिया जाता है जब संदर्भ संख्या शून्य हो जाती है, लेकिन चक्र का हिस्सा होने वाली वस्तुओं को गैर-नियतात्मक रूप से नष्ट कर दिया जाता है। कचरा संग्रह के एक अलग रूप का हिस्सा।
उन भाषाओं के लिए जो संदर्भ गिनती के माध्यम से कचरा संग्रह को प्रयुक्त करती हैं | शब्दावली अलग होती है | कुछ भाषाओं जैसे [[ उद्देश्य सी | उद्देश्य C]] और [[पर्ल]] विनाशक का उपयोग करते हुए, और अन्य भाषाओं जैसे कि पायथन फ़ाइनलाइज़र का उपयोग करते हुए (प्रति युक्ति, पायथन कचरा एकत्र किया जाता है, किन्तु संदर्भ [[CPython|C पायथन]] कार्यान्वयन इसके बाद से संस्करण 2.0 संदर्भ गिनती और कचरा संग्रह के संयोजन का उपयोग करता है)। यह दर्शाता है कि संदर्भ गणना का परिणाम अर्ध-नियतात्मक ऑब्जेक्ट जीवनकाल में होता है | उन ऑब्जेक्ट के लिए जो  चक्र का भाग नहीं हैं | ऑब्जेक्ट को निश्चित रूप से नष्ट कर दिया जाता है जब संदर्भ संख्या शून्य हो जाती है, किन्तु चक्र का भाग होने वाली ऑब्जेक्ट को गैर-नियतात्मक रूप से नष्ट कर दिया जाता है। कचरा संग्रह के एक अलग रूप का भाग होता है ।


कुछ संकीर्ण तकनीकी उपयोगों में, कंस्ट्रक्टर और डिस्ट्रक्टर भाषा-स्तर के शब्द हैं, जिसका अर्थ है कि  वर्ग में परिभाषित विधियाँ, जबकि इनिशियलाइज़र और फ़ाइनलाइज़र कार्यान्वयन-स्तर की शर्तें हैं, जिसका अर्थ है वस्तु निर्माण या विनाश के दौरान बुलाई जाने वाली विधियाँ। इस प्रकार उदाहरण के लिए सी शार्प (प्रोग्रामिंग भाषा) के लिए मूल विनिर्देश | सी # भाषा विनाशकों को संदर्भित करती है, भले ही सी # कचरा-एकत्रित है, लेकिन सामान्य भाषा इंफ्रास्ट्रक्चर (सीएलआई) के लिए विनिर्देश, और इसके रनटाइम पर्यावरण के कार्यान्वयन के रूप में [[ सामान्य भाषा रनटाइम ]] (सीएलआर), जिसे फाइनलाइजर्स कहा जाता है। यह C# भाषा समिति के नोट्स में परिलक्षित होता है, जो भाग में पढ़ता है: C# कंपाइलर डिस्ट्रक्टर्स को संकलित करता है ... [शायद] उदाहरण फाइनलाइज़र [एस]।<ref>In full: "We're going to use the term "destructor" for the member which executes when an instance is reclaimed. Classes can have destructors; structs can't. Unlike in C++, a destructor cannot be called explicitly. Destruction is non-deterministic – you can't reliably know when the destructor will execute, except to say that it executes at some point after all references to the object have been released. The destructors in an inheritance chain are called in order, from most descendant to least descendant. There is no need (and no way) for the derived class to explicitly call the base destructor. The C# compiler compiles destructors to the appropriate CLR representation. For this version that probably means an instance finalizer that is distinguished in metadata. CLR may provide static finalizers in the future; we do not see any barrier to C# using static finalizers.", May 12th, 1999.</ref><ref>[http://blogs.msdn.com/b/ericlippert/archive/2010/01/21/what-s-the-difference-between-a-destructor-and-a-finalizer.aspx What’s the difference between a destructor and a finalizer?], Eric Lippert, ''Eric Lippert’s Blog: Fabulous Adventures In Coding,'' 21 Jan 2010</ref> यह शब्दावली भ्रमित करने वाली है, और इस प्रकार सी # स्पेक के अधिक हाल के संस्करण भाषा-स्तरीय पद्धति को finalizers के रूप में संदर्भित करते हैं।<ref name=csharpname/>
कुछ संकीर्ण विधि उपयोगों में, कंस्ट्रक्टर और विनाशक भाषा-स्तर के शब्द हैं | जिसका अर्थ है कि  वर्ग में परिभाषित विधियाँ, जबकि इनिशियलाइज़र और फ़ाइनलाइज़र कार्यान्वयन-स्तर की शर्तें हैं | जिसका अर्थ है ऑब्जेक्ट निर्माण या विनाश के समय बुलाई जाने वाली विधियाँ है। इस प्रकार उदाहरण के लिए C शार्प (प्रोग्रामिंग भाषा) के लिए मूल विनिर्देश C भाषा विनाशकों को संदर्भित करती है | तथापि C कचरा-एकत्रित है, किन्तु सामान्य भाषा इंफ्रास्ट्रक्चर (सीएलआई) के लिए विनिर्देश, और इसके रनटाइम पर्यावरण के कार्यान्वयन के रूप में [[ सामान्य भाषा रनटाइम ]] (सीएलआर), जिसे फाइनलाइजर्स कहा जाता है। यह C भाषा समिति के नोट्स में परिलक्षित होता है | जो भाग में पढ़ता है | C कंपाइलर डिस्ट्रक्टर्स को संकलित करता है | संभवतः उदाहरण फाइनलाइज़र एस <ref>In full: "We're going to use the term "destructor" for the member which executes when an instance is reclaimed. Classes can have destructors; structs can't. Unlike in C++, a destructor cannot be called explicitly. Destruction is non-deterministic – you can't reliably know when the destructor will execute, except to say that it executes at some point after all references to the object have been released. The destructors in an inheritance chain are called in order, from most descendant to least descendant. There is no need (and no way) for the derived class to explicitly call the base destructor. The C# compiler compiles destructors to the appropriate CLR representation. For this version that probably means an instance finalizer that is distinguished in metadata. CLR may provide static finalizers in the future; we do not see any barrier to C# using static finalizers.", May 12th, 1999.</ref><ref>[http://blogs.msdn.com/b/ericlippert/archive/2010/01/21/what-s-the-difference-between-a-destructor-and-a-finalizer.aspx What’s the difference between a destructor and a finalizer?], Eric Lippert, ''Eric Lippert’s Blog: Fabulous Adventures In Coding,'' 21 Jan 2010</ref> यह शब्दावली भ्रमित करने वाली है, और इस प्रकार C स्पेक के अधिक हाल के संस्करण भाषा-स्तरीय पद्धति को फ़ाइनलाइज़र के रूप में संदर्भित करते हैं।<ref name=csharpname/>


एक अन्य भाषा जो इस शब्दावली भेद को नहीं बनाती है वह है डी। हालांकि डी कक्षाएं कचरा एकत्र की जाती हैं, उनके सफाई कार्यों को विध्वंसक कहा जाता है।<ref>[http://dlang.org/class.html#destructors Class destructors] Class destructors in D</ref>
एक अन्य भाषा जो d इस शब्दावली भेद को नहीं बनाती है | चूँकि d कक्षाएं कचरा एकत्र की जाती हैं | उनके सफाई कार्यों को विध्वंसक कहा जाता है।<ref>[http://dlang.org/class.html#destructors Class destructors] Class destructors in D</ref>




== प्रयोग करें ==
== प्रयोग ==
फाइनलाइजेशन का उपयोग ज्यादातर सफाई के लिए, मेमोरी या अन्य संसाधनों को जारी करने के लिए किया जाता है: [[ मैनुअल मेमोरी प्रबंधन ]] के माध्यम से आवंटित मेमोरी को हटाने के लिए; यदि संदर्भ गणना का उपयोग किया जाता है तो संदर्भों को स्पष्ट करने के लिए (संदर्भ संख्या में कमी); संसाधनों को जारी करने के लिए, विशेष रूप से संसाधन अधिग्रहण प्रारंभिक (आरएआईआई) मुहावरे में है; या किसी वस्तु को अपंजीकृत करने के लिए। अंतिम रूप देने की मात्रा भाषाओं के बीच महत्वपूर्ण रूप से भिन्न होती है, C++ में व्यापक अंतिमीकरण से, जिसमें मैनुअल स्मृति प्रबंधन, संदर्भ गणना, और नियतात्मक वस्तु जीवन काल होता है; जावा में अक्सर कोई अंतिम रूप नहीं दिया जाता है, जिसमें गैर-नियतात्मक वस्तु जीवनकाल होता है और अक्सर ट्रेसिंग कचरा संग्राहक के साथ लागू किया जाता है। यह भी संभव है कि कम या कोई स्पष्ट (उपयोगकर्ता-निर्दिष्ट) अंतिम रूप न हो, लेकिन संकलक, दुभाषिया, या रनटाइम द्वारा निष्पादित महत्वपूर्ण अंतर्निहित अंतिमकरण; [[स्वचालित संदर्भ गिनती]] के मामले में यह सामान्य है, जैसा कि पायथन के सीपीथॉन संदर्भ कार्यान्वयन में, या ऐप्पल के ऑब्जेक्टिव-सी के कार्यान्वयन में स्वचालित संदर्भ गणना में, जो दोनों अंतिम रूप से संदर्भों को स्वचालित रूप से तोड़ देते हैं।  फाइनलाइज़र में मनमाना कोड शामिल हो सकता है; विशेष रूप से जटिल उपयोग ऑब्जेक्ट को [[ वस्तु पूल ]] में स्वचालित रूप से वापस करना है।
फाइनलाइजेशन का उपयोग अधिकतर सफाई के लिए, मेमोरी या अन्य संसाधनों को जारी करने के लिए किया जाता है | [[ मैनुअल मेमोरी प्रबंधन ]] के माध्यम से आवंटित मेमोरी को हटाने के लिए; यदि संदर्भ गणना का उपयोग किया जाता है तो संदर्भों को स्पष्ट करने के लिए (संदर्भ संख्या में कमी) संसाधनों को जारी करने के लिए, विशेष रूप से संसाधन अधिग्रहण प्रारंभिक (आरएआईआई) मुहावरे में है या किसी ऑब्जेक्ट को अपंजीकृत करने के लिए अंतिम रूप देने की मात्रा भाषाओं के बीच महत्वपूर्ण रूप से अलग होती है | C++ में व्यापक अंतिमीकरण से, जिसमें मैनुअल स्मृति प्रबंधन, संदर्भ गणना, और नियतात्मक ऑब्जेक्ट जीवन काल होता है | जावा में अधिकाशतः कोई अंतिम रूप नहीं दिया जाता है, जिसमें गैर-नियतात्मक ऑब्जेक्ट जीवनकाल होता है और अधिकाशतः ट्रेसिंग कचरा संग्राहक के साथ प्रयुक्त किया जाता है। यह भी संभव है कि कम या कोई स्पष्ट (उपयोगकर्ता-निर्दिष्ट) अंतिम रूप न हो, किन्तु संकलक, दुभाषिया, या रनटाइम द्वारा निष्पादित महत्वपूर्ण अंतर्निहित अंतिमकरण के स्थिति में यह सामान्य है | जैसा कि पायथन के सीपीथॉन संदर्भ कार्यान्वयन में, या ऐप्पल के ऑब्जेक्टिव-C के कार्यान्वयन में स्वचालित संदर्भ गणना में, जो दोनों अंतिम रूप से संदर्भों को स्वचालित रूप से तोड़ देते हैं।  फाइनलाइज़र में मनमाना कोड सम्मिलित हो सकता है | विशेष रूप से जटिल उपयोग ऑब्जेक्ट को [[ वस्तु पूल | ऑब्जेक्ट पूल]] में स्वचालित रूप से वापस करना है।


फाइनलाइजेशन के दौरान मेमोरी डीलोकेशन C++ जैसी भाषाओं में आम है जहां मैनुअल मेमोरी मैनेजमेंट मानक है, लेकिन प्रबंधित भाषाओं में भी होता है जब मेमोरी को प्रबंधित हीप के बाहर आवंटित किया गया है (बाह्य रूप से भाषा के लिए); जावा में यह [[ जावा मूल इंटरफ़ेस ]] (JNI) और के साथ होता है <code>ByteBuffer</code> नॉन-ब्लॉकिंग I/O (जावा) में ऑब्जेक्ट | नया I/O (NIO)यह उत्तरार्द्ध कचरा संग्रहकर्ता के इन बाहरी संसाधनों को ट्रैक करने में असमर्थ होने के कारण समस्याएँ पैदा कर सकता है, इसलिए उन्हें आक्रामक रूप से पर्याप्त रूप से एकत्र नहीं किया जाएगा, और अप्रबंधित मेमोरी को समाप्त करने के कारण आउट-ऑफ़-मेमोरी त्रुटियाँ पैदा कर सकता है - देशी मेमोरी का इलाज करके इससे बचा जा सकता है संसाधन के रूप में और डिस्पोजल पैटर्न का उपयोग करते हुए, जैसा कि नीचे चर्चा की गई है।
फाइनलाइजेशन के समय मेमोरी डीलोकेशन C++ जैसी भाषाओं में सामान्य है | जहां मैनुअल मेमोरी मैनेजमेंट मानक है, किन्तु प्रबंधित भाषाओं में भी होता है | जब मेमोरी को प्रबंधित हीप के बाहर आवंटित किया गया है |(बाह्य रूप से भाषा के लिए) जावा में यह [[ जावा मूल इंटरफ़ेस ]] (जेएनआई) और के साथ होता है | <code>ByteBuffer</code> नॉन-ब्लॉकिंग I/O (जावा) में ऑब्जेक्ट नया I/O (एनआईओ) यह उत्तरार्द्ध कचरा संग्रहकर्ता के इन बाहरी संसाधनों को ट्रैक करने में असमर्थ होने के कारण समस्याएँ उत्पन्न कर सकता है | इसलिए उन्हें आक्रामक रूप से पर्याप्त रूप से एकत्र नहीं किया जाएगा, और अप्रबंधित मेमोरी को समाप्त करने के कारण आउट-ऑफ़-मेमोरी त्रुटियाँ उत्पन्न कर सकता है | देशी मेमोरी का इलाज करके इससे बचा जा सकता है | संसाधन के रूप में और डिस्पोजल पैटर्न का उपयोग करते हुए, जैसा कि नीचे चर्चा की गई है।


फ़ाइनलाइज़र आमतौर पर बहुत कम आवश्यक होते हैं और विध्वंसक की तुलना में बहुत कम उपयोग किए जाते हैं। वे बहुत कम आवश्यक हैं क्योंकि कचरा संग्रह स्मृति प्रबंधन को स्वचालित करता है, और बहुत कम उपयोग किया जाता है क्योंकि वे आम तौर पर निश्चित रूप से निष्पादित नहीं होते हैं - उन्हें समय पर ढंग से या बिल्कुल भी नहीं बुलाया जा सकता है, और निष्पादन वातावरण की भविष्यवाणी नहीं की जा सकती है - और इस प्रकार कोई भी क्लीनअप जो निश्चित रूप से किया जाना चाहिए, इसके बजाय किसी अन्य विधि द्वारा किया जाना चाहिए, अक्सर मैन्युअल रूप से निपटान पैटर्न के माध्यम से। विशेष रूप से, जावा और पायथन दोनों इस बात की गारंटी नहीं देते हैं कि फाइनलाइजर्स को कभी भी बुलाया जाएगा, और इस प्रकार उन्हें सफाई के लिए भरोसा नहीं किया जा सकता है।
फ़ाइनलाइज़र सामान्यतः बहुत कम आवश्यक होते हैं और विध्वंसक की तुलना में बहुत कम उपयोग किए जाते हैं। वे बहुत कम आवश्यक हैं क्योंकि कचरा संग्रह स्मृति प्रबंधन को स्वचालित करता है, और बहुत कम उपयोग किया जाता है | क्योंकि वे सामान्यतः निश्चित रूप से निष्पादित नहीं होते हैं | उन्हें समय पर सही से या बिल्कुल भी नहीं बुलाया जा सकता है, और निष्पादन वातावरण की पूर्वानुमान नहीं की जा सकती है और इस प्रकार कोई भी क्लीनअप जो निश्चित रूप से किया जाना चाहिए | इसके अतिरिक्त किसी अन्य विधि द्वारा किया जाना चाहिए | अधिकाशतः मैन्युअल रूप से निपटान पैटर्न के माध्यम से विशेष रूप से, जावा और पायथन दोनों इस बात की गारंटी नहीं देते हैं कि फाइनलाइजर्स को कभी भी बुलाया जाएगा, और इस प्रकार उन्हें सफाई के लिए विश्वास नहीं किया जा सकता है।


उनके निष्पादन पर प्रोग्रामर नियंत्रण की कमी के कारण, आमतौर पर किसी भी लेकिन सबसे तुच्छ संचालन के लिए फाइनलाइज़र से बचने की सिफारिश की जाती है। विशेष रूप से, विध्वंसक में अक्सर किए जाने वाले ऑपरेशन आमतौर पर अंतिम रूप देने वालों के लिए उपयुक्त नहीं होते हैं।  सामान्य विरोधी प्रतिमान फाइनलाइज़र लिखना है जैसे कि वे विध्वंसक थे, जो अनावश्यक और अप्रभावी दोनों हैं, अंतिम रूप देने वालों और विध्वंसकों के बीच अंतर के कारण। यह सी ++ प्रोग्रामर के बीच विशेष रूप से आम है, क्योंकि रिसोर्स एक्विजिशन इज़ इनिशियलाइज़ेशन (RAII) मुहावरे के बाद मुहावरेदार C ++ में डिस्ट्रक्टर्स का भारी उपयोग किया जाता है।
उनके निष्पादन पर प्रोग्रामर नियंत्रण की कमी के कारण, सामान्यतः किसी भी किन्तु सबसे सामान्य संचालन के लिए फाइनलाइज़र से बचने की पक्षसमर्थन की जाती है। विशेष रूप से, विध्वंसक में अधिकाशतः किए जाने वाले संचालन सामान्यतः अंतिम रूप देने वालों के लिए उपयुक्त नहीं होते हैं।  सामान्य विरोधी प्रतिमान फाइनलाइज़र लिखना है जैसे कि वे विध्वंसक थे | जो अनावश्यक और अप्रभावी दोनों हैं | अंतिम रूप देने वालों और विध्वंसकों के बीच अंतर के कारण यह C++ प्रोग्रामर के बीच विशेष रूप से सामान्य है | क्योंकि रिसोर्स एक्विजिशन इज़ इनिशियलाइज़ेशन (आरएआईआई) मुहावरे के बाद मुहावरेदार C ++ में डिस्ट्रक्टर्स का भारी उपयोग किया जाता है।


== सिंटेक्स ==
== वाक्य-विन्यास ==
फाइनलाइज़र का उपयोग करने [[जावास्क्रिप्ट (प्रोग्रामिंग भाषा)]] में C++/CLI, C Sharp (प्रोग्रामिंग लैंग्वेज)|C#, [[ स्वच्छ (प्रोग्रामिंग भाषा) ]], [[ जाओ (प्रोग्रामिंग भाषा) ]], Java (प्रोग्रामिंग लैंग्वेज), JavaScript (प्रोग्रामिंग लैंग्वेज) और Python (प्रोग्रामिंग लैंग्वेज) शामिल हैं। वाक्य-विन्यास भाषा के अनुसार काफी भिन्न होता है।
फाइनलाइज़र का उपयोग करने [[जावास्क्रिप्ट (प्रोग्रामिंग भाषा)]] में C++/CLI, C तेज़ (प्रोग्रामिंग लैंग्वेज) C, [[ स्वच्छ (प्रोग्रामिंग भाषा) | क्लीन (प्रोग्रामिंग भाषा)]] , [[ जाओ (प्रोग्रामिंग भाषा) | जावा (प्रोग्रामिंग भाषा)]] , जावा (प्रोग्रामिंग लैंग्वेज), जावास्क्रिप्ट (प्रोग्रामिंग लैंग्वेज) और पायथन (प्रोग्रामिंग लैंग्वेज) सम्मिलित हैं। वाक्य-विन्यास भाषा के अनुसार अधिक अलग होता है।


जावा में, फाइनलाइज़र  विधि है जिसे कहा जाता है <code>finalize</code>, जो ओवरराइड करता है <code>Object.finalize</code> तरीका।<ref name=java_Object.finalize>java.lang, क्लास ऑब्जेक्ट: [http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html# finalize() finalize]</ref>
जावा में, फाइनलाइज़र  विधि है जिसे <code>finalize</code> कहा जाता है | जो ओवरराइड <code>Object.finalize</code> विधि करता है।<ref name=java_Object.finalize>java.lang, क्लास ऑब्जेक्ट: [http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html# finalize() finalize]</ref>


JavaScript में, [https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/FinalizationRegistry finalizationRegistry] आपको किसी वस्तु के कूड़ा-कचरा एकत्र करने पर कॉलबैक का अनुरोध करने की अनुमति देता है।
जावास्क्रिप्ट में, [https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/FinalizationRegistry finalizationRegistry] आपको किसी ऑब्जेक्ट के कूड़ा-कचरा एकत्र करने पर कॉलबैक का अनुरोध करने की अनुमति देता है।


पायथन में, फाइनलाइज़र  विधि है जिसे कहा जाता है <code>__del__</code>.
पायथन में, फाइनलाइज़र  विधि है जिसे <code>__del__</code>. कहा जाता है |


पर्ल में, फ़ाइनलाइज़र  विधि है जिसे कहा जाता है <code>DESTROY</code>.
पर्ल में, फ़ाइनलाइज़र  विधि है | जिसे <code>DESTROY</code>. कहा जाता है |


सी # में,  अंतिमकर्ता (मानक के पुराने संस्करणों में विनाशक कहा जाता है) एक विधि है जिसका नाम कक्षा का नाम है <code>~</code> पूर्वसर्ग, के रूप में <code>~Foo</code> - यह सी ++ डिस्ट्रक्टर के समान सिंटैक्स है, और इन विधियों को मूल रूप से डिस्ट्रक्टर्स कहा जाता था, अलग-अलग व्यवहार होने के बावजूद, सी ++ के साथ सादृश्य द्वारा, लेकिन इसके कारण होने वाले भ्रम के कारण इसका नाम बदलकर फाइनल कर दिया गया।<ref name=csharpname>{{harvnb|Jagger|Perry|Sestoft|2007|p=[https://books.google.com/books?id=g6axWRRpJZwC&dq=destructor+finalizer&pg=PA542 542]|ps=, "In the previous version of this standard, what is now referred to as a “finalizer” was called a “destructor”. Experience has shown that the term “destructor” caused confusion and often resulted in incorrect expectations, especially to programmers knowing C++. In C++, a destructor is called in a determinate manner, whereas, in C#, a finalizer is not. To get determinate behavior from C#, one should use <code>Dispose.</code>"}}</ref>
C में,  अंतिमकर्ता (मानक के पुराने संस्करणों में विनाशक कहा जाता है) एक विधि है जिसका नाम <code>~</code> पूर्वसर्ग, के रूप में वर्ग का नाम है | जैसा कि <code>~Foo</code> में है |  यह C++ विनाशक के समान सिंटैक्स है, और इन विधियों को मूल रूप से डिस्ट्रक्टर्स कहा जाता था, अलग-अलग व्यवहार होने के अतिरिक्त, C++ के साथ सादृश्य द्वारा, किन्तु इसके कारण होने वाले भ्रम के कारण इसका नाम बदलकर फाइनल कर दिया गया।<ref name=csharpname>{{harvnb|Jagger|Perry|Sestoft|2007|p=[https://books.google.com/books?id=g6axWRRpJZwC&dq=destructor+finalizer&pg=PA542 542]|ps=, "In the previous version of this standard, what is now referred to as a “finalizer” was called a “destructor”. Experience has shown that the term “destructor” caused confusion and often resulted in incorrect expectations, especially to programmers knowing C++. In C++, a destructor is called in a determinate manner, whereas, in C#, a finalizer is not. To get determinate behavior from C#, one should use <code>Dispose.</code>"}}</ref>
सी ++/सीएलआई में, जिसमें विनाशक और फाइनलाइज़र दोनों हैं, विनाशक एक विधि है जिसका नाम कक्षा का नाम है <code>~</code> पूर्वसर्ग, के रूप में <code>~Foo</code> (जैसा कि सी # में), और  फाइनलाइज़र एक विधि है जिसका नाम कक्षा का नाम है <code>!</code> पूर्वसर्ग, के रूप में <code>!Foo</code>.
 
C++/सीएलआई में, जिसमें विनाशक और फाइनलाइज़र दोनों हैं | विनाशक एक विधि है जिसका नाम <code>~</code> पूर्वसर्ग, के रूप में वर्ग का नाम है | जैसा कि  <code>~Foo</code> (C # में), और  फाइनलाइज़र एक विधि है जिसका नाम <code>!</code> वर्ग का नाम है | जैसा कि पूर्वसर्ग, के रूप में <code>!Foo</code>. है |
 
 
 
फाइनलाइजर्स को मानक पुस्तकालय में रनटाइम.<code>runtime.SetFinalizer</code> फ़ंक्शन को कॉल करके एकल सूचक पर लागू किया जाता है।<ref>{{Cite web|url=https://golang.org/pkg/runtime/#SetFinalizer|title=Runtime package - runtime - PKG.go.dev}}</ref>


गो फाइनलाइजर्स को कॉल करके सिंगल पॉइंटर पर लागू किया जाता है <code>runtime.SetFinalizer</code> मानक पुस्तकालय में काम करता है।<ref>{{Cite web|url=https://golang.org/pkg/runtime/#SetFinalizer|title=Runtime package - runtime - PKG.go.dev}}</ref>




== कार्यान्वयन ==
== कार्यान्वयन ==
फाइनलाइज़र को तब कहा जाता है जब  [[वस्तु (कंप्यूटर विज्ञान)]] कचरा एकत्र किया जाता है - वस्तु कचरा (पहुंच योग्य) बनने के बाद, लेकिन इससे पहले कि उसकी मेमोरी को हटा दिया जाए। कचरा संग्राहक के विवेक पर अंतिम रूप से गैर-नियतात्मक रूप से होता है, और कभी नहीं हो सकता है। यह विनाशकों के साथ विरोधाभासी है, जिन्हें नियतात्मक रूप से कहा जाता है जैसे ही कोई वस्तु अब उपयोग में नहीं होती है, और अनियंत्रित कार्यक्रम समाप्ति के मामले को छोड़कर हमेशा कहा जाता है। ऑब्जेक्ट-विशिष्ट संचालन करने की आवश्यकता के कारण फ़ाइनलाइज़र अक्सर [[उदाहरण विधि]]याँ हैं।
फाइनलाइज़र को तब कहा जाता है | जब  [[वस्तु (कंप्यूटर विज्ञान)|ऑब्जेक्ट (कंप्यूटर विज्ञान)]] कचरा एकत्र किया जाता है  | ऑब्जेक्ट कचरा (पहुंच योग्य) बनने के बाद, किन्तु इससे पहले कि उसकी मेमोरी को हटा दिया जाए। कचरा संग्राहक के विवेक पर अंतिम रूप से गैर-नियतात्मक रूप से होता है, और कभी नहीं हो सकता है। यह विनाशकों के साथ विरोधाभासी है | जिन्हें नियतात्मक रूप से कहा जाता है | जैसे ही कोई ऑब्जेक्ट अब उपयोग में नहीं होती है, और अनियंत्रित कार्यक्रम समाप्ति के स्थिति को छोड़कर सदैव कहा जाता है। ऑब्जेक्ट-विशिष्ट संचालन करने की आवश्यकता के कारण फ़ाइनलाइज़र अधिकाशतः [[उदाहरण विधि]]याँ हैं।


कचरा संग्राहक को वस्तु के पुनरुत्थान की संभावना का भी ध्यान रखना चाहिए। आमतौर पर यह पहले फाइनलाइजर्स को निष्पादित करके किया जाता है, फिर जांच की जाती है कि क्या कोई वस्तु फिर से जीवित हो गई है, और यदि ऐसा है, तो उनके विनाश को रद्द कर दिया गया है। यह अतिरिक्त जांच संभावित रूप से महंगी है साधारण कार्यान्वयन सभी कचरे की फिर से जाँच करता है यदि एक भी वस्तु को अंतिम रूप दिया जाता है - और इस तरह दोनों धीमा हो जाता है और कचरा संग्रह को जटिल बना देता है। इस कारण से, फ़ाइनलाइज़र वाली वस्तुओं को फ़ाइनलाइज़र के बिना वस्तुओं की तुलना में कम बार एकत्र किया जा सकता है (केवल कुछ चक्रों पर), संसाधन लीक जैसे शीघ्र अंतिमकरण पर निर्भर होने के कारण होने वाली समस्याओं को बढ़ा देता है।
कचरा संग्राहक को ऑब्जेक्ट के पुनरुत्थान की संभावना का भी ध्यान रखना चाहिए। सामान्यतः यह पहले फाइनलाइजर्स को निष्पादित करके किया जाता है | फिर जांच की जाती है कि क्या कोई ऑब्जेक्ट फिर से जीवित हो गई है, और यदि ऐसा है, तो उनके विनाश को रद्द कर दिया गया है। यह अतिरिक्त जांच संभावित रूप से महंगी है | साधारण कार्यान्वयन सभी कचरे की फिर से जाँच करता है | यदि एक भी ऑब्जेक्ट को अंतिम रूप दिया जाता है और इस तरह दोनों धीमा हो जाता है और कचरा संग्रह को जटिल बना देता है। इस कारण से, फ़ाइनलाइज़र वाली ऑब्जेक्ट को फ़ाइनलाइज़र के बिना ऑब्जेक्ट की तुलना में कम बार एकत्र किया जा सकता है |(केवल कुछ चक्रों पर), संसाधन लीक जैसे शीघ्र अंतिमकरण पर निर्भर होने के कारण होने वाली समस्याओं को बढ़ा देता है।


यदि किसी वस्तु को पुनर्जीवित किया जाता है, तो आगे का प्रश्न है कि क्या इसके फाइनलाइज़र को फिर से नष्ट कर दिया जाता है, जब इसे नष्ट कर दिया जाता है - विनाशकों के विपरीत, फाइनलाइज़र को संभावित रूप से कई बार बुलाया जाता है। यदि अंतिम रूप देने वालों को पुनर्जीवित वस्तुओं के लिए बुलाया जाता है, तो वस्तुएं बार-बार खुद को पुनर्जीवित कर सकती हैं और अविनाशी हो सकती हैं; यह Python 3.4 से पहले Python के CPython कार्यान्वयन में और C# जैसी CLR भाषाओं में होता है। इससे बचने के लिए, जावा, ऑब्जेक्टिव-सी (कम से कम हाल के ऐप्पल कार्यान्वयन में), और पायथन 3.4 से पायथन सहित कई भाषाओं में, वस्तुओं को एक बार में अंतिम रूप दिया जाता है, जिसके लिए ट्रैकिंग की आवश्यकता होती है यदि वस्तु को अभी तक अंतिम रूप दिया गया है।
यदि किसी ऑब्जेक्ट को पुनर्जीवित किया जाता है, तो आगे का प्रश्न है कि क्या इसके फाइनलाइज़र को फिर से नष्ट कर दिया जाता है | जब इसे नष्ट कर दिया जाता है | विनाशकों के विपरीत, फाइनलाइज़र को संभावित रूप से कई बार बुलाया जाता है। यदि अंतिम रूप देने वालों को पुनर्जीवित ऑब्जेक्ट के लिए बुलाया जाता है, तो वस्तुएं बार-बार खुद को पुनर्जीवित कर सकती हैं और अविनाशी हो सकती हैं | यह पायथन 3.4 से पहले पायथन के C पायथन कार्यान्वयन में और C # जैसी सीएलआर भाषाओं में होता है। इससे बचने के लिए, जावा, ऑब्जेक्टिव-C (कम से कम हाल के ऐप्पल कार्यान्वयन में), और पायथन 3.4 से पायथन सहित कई भाषाओं में, ऑब्जेक्ट को एक बार में अंतिम रूप दिया जाता है | जिसके लिए ट्रैकिंग की आवश्यकता होती है | यदि ऑब्जेक्ट को अभी तक अंतिम रूप दिया गया है।


अन्य मामलों में, विशेष रूप से सीएलआर भाषाओं जैसे सी #, अंतिम रूप से वस्तुओं से अलग से ट्रैक किया जाता है, और वस्तुओं को अंतिम रूप देने के लिए बार-बार पंजीकृत या अपंजीकृत किया जा सकता है।
अन्य स्थितियों में, विशेष रूप से सीएलआर भाषाओं जैसे C #, अंतिम रूप से ऑब्जेक्ट से अलग से ट्रैक किया जाता है, और ऑब्जेक्ट को अंतिम रूप देने के लिए बार-बार पंजीकृत या अपंजीकृत किया जा सकता है।


== समस्याएं ==
== समस्याएं ==
कार्यान्वयन के आधार पर, अंतिमकर्ता बड़ी संख्या में समस्याएं पैदा कर सकते हैं, और इस प्रकार कई अधिकारियों द्वारा दृढ़ता से हतोत्साहित किया जाता है।<ref name=certjava>"[https://www.securecoding.cert.org/confluence/display/java/MET12-J.+Do+not+use+finalizers MET12-J. Do no