डिस्ट्रक्टर (कंप्यूटर प्रोग्रामिंग): Difference between revisions

From Vigyanwiki
No edit summary
No edit summary
Line 1: Line 1:
वस्तु-उन्मुख प्रोग्रामिंग में, एक विध्वंसक (कभी-कभी संक्षिप्त रूप में dtor<ref>{{Cite news|url=https://acronyms.thefreedictionary.com/झाड़ी|title=झाड़ी|work=TheFreeDictionary.com|access-date=2018-10-14}}</ref>) एक [[विधि (कंप्यूटर विज्ञान)]] है जिसे [[वस्तु (कंप्यूटर विज्ञान)]] की मेमोरी जारी होने से ठीक पहले यांत्रिक रूप से लागू किया जाता है।<ref name=SebestaLanguages>{{cite book |last1=Sebesta |first1=Robert W. |title=Concepts of Programming Languages |chapter="11.4.2.3 Constructors and Destructors" |date=2012 |publisher=Addison-Wesley |location=Boston, MA, USA |isbn=978-0-13-139531-2 |page=487 |edition=10th |url=https://www.pearson.com/us/higher-education/product/Sebesta-Concepts-of-Programming-Languages-10th-Edition/9780131395312.html |language=en |format=print}}</ref> यह तब हो सकता है जब इसका [[वस्तु जीवनकाल]] [[स्कोप (कंप्यूटर साइंस)]] से जुड़ा हो और निष्पादन स्कोप छोड़ देता है, जब यह किसी अन्य ऑब्जेक्ट में एम्बेड किया जाता है जिसका जीवनकाल समाप्त हो जाता है, या जब यह मेमोरी मैनेजमेंट # मैनुअल मेमोरी मैनेजमेंट था और स्पष्ट रूप से जारी किया गया था। इसका मुख्य उद्देश्य [[संसाधन (कंप्यूटर विज्ञान)]] (स्मृति आवंटन, खुली फ़ाइलें या सॉकेट, [[डेटाबेस कनेक्शन]], संसाधन ताले, आदि) को मुक्त करना है, जो वस्तु द्वारा उसके जीवन के समय अधिग्रहित किए गए थे और/या अन्य संस्थाओं से अपंजीकृत हो सकते हैं जो संदर्भ रख सकते हैं इसे। [[संसाधन अधिग्रहण प्रारंभ है]] (RAII) की प्रक्रिया के लिए डिस्ट्रक्टर्स के उपयोग की आवश्यकता है।
वस्तु-उन्मुख प्रोग्रामिंग में, एक डिस्ट्रक्टर (कभी-कभी संक्षिप्त रूप में डीटोर<ref>{{Cite news|url=https://acronyms.thefreedictionary.com/झाड़ी|title=झाड़ी|work=TheFreeDictionary.com|access-date=2018-10-14}}</ref>) एक [[विधि (कंप्यूटर विज्ञान)]] है जिसे [[वस्तु (कंप्यूटर विज्ञान)]] की मेमोरी जारी होने से ठीक पहले यांत्रिक रूप से लागू किया जाता है।<ref name=SebestaLanguages>{{cite book |last1=Sebesta |first1=Robert W. |title=Concepts of Programming Languages |chapter="11.4.2.3 Constructors and Destructors" |date=2012 |publisher=Addison-Wesley |location=Boston, MA, USA |isbn=978-0-13-139531-2 |page=487 |edition=10th |url=https://www.pearson.com/us/higher-education/product/Sebesta-Concepts-of-Programming-Languages-10th-Edition/9780131395312.html |language=en |format=print}}</ref> यह तब हो सकता है जब इसका [[वस्तु जीवनकाल]] [[स्कोप (कंप्यूटर साइंस)]] से जुड़ा हो और निष्पादन स्कोप छोड़ देता है, जब यह किसी अन्य ऑब्जेक्ट में एम्बेड किया जाता है जिसका जीवनकाल समाप्त हो जाता है, या जब यह मेमोरी मैनेजमेंट मैनुअल मेमोरी मैनेजमेंट था और स्पष्ट रूप से जारी किया गया था। इसका मुख्य उद्देश्य [[संसाधन (कंप्यूटर विज्ञान)]] (स्मृति आवंटन, खुली फ़ाइलें या सॉकेट, [[डेटाबेस कनेक्शन]], संसाधन ताले, आदि) को मुक्त करना है, जो वस्तु द्वारा उसके जीवन के समय अधिग्रहित किए गए थे और/या अन्य संस्थाओं से अपंजीकृत हो सकते हैं जो संदर्भ रख सकते हैं इसे। [[संसाधन अधिग्रहण प्रारंभ है]] (RAII) की प्रक्रिया के लिए डिस्ट्रक्टर्स के उपयोग की आवश्यकता है।


अधिकांश प्रकार के [[कचरा संग्रह (कंप्यूटर विज्ञान)]] एल्गोरिदम के साथ<!-- except e.g. strict reference counting (see early Python) where an object is freed as soon as its refcount reaches 0-->, ऑब्जेक्ट के अगम्य हो जाने के बाद लंबे समय तक मेमोरी रिलीज़ हो सकती है, जिससे डिस्ट्रक्टर्स (इस स्थिति में [[finalizer]] कहलाते हैं) अधिकांश उद्देश्यों के लिए अनुपयुक्त हो जाते हैं। ऐसी भाषाओं में, संसाधनों को मुक्त करना या तो एक शाब्दिक निर्माण के माध्यम से किया जाता है (जैसे कि try..अंत में, Python's with या Java के try-with-resources), जो कि RAII के समतुल्य है, या स्पष्ट रूप से एक फ़ंक्शन (के बराबर) को कॉल करके किया जाता है। स्पष्ट विलोपन); विशेष रूप से, कई ऑब्जेक्ट-ओरिएंटेड भाषाएं [[निपटान पैटर्न]] का उपयोग करती हैं।
अधिकांश प्रकार के [[कचरा संग्रह (कंप्यूटर विज्ञान)]] एल्गोरिदम के साथ, ऑब्जेक्ट के अगम्य हो जाने के बाद लंबे समय तक मेमोरी रिलीज़ हो सकती है, जिससे डिस्ट्रक्टर्स (इस स्थिति में [[finalizer]] कहलाते हैं) अधिकांश उद्देश्यों के लिए अनुपयुक्त हो जाते हैं। ऐसी भाषाओं में, संसाधनों को मुक्त करना या तो एक शाब्दिक निर्माण के माध्यम से किया जाता है (जैसे कि try..अंत में, Python's with या Java के try-with-resources), जो कि RAII के समतुल्य है, या स्पष्ट रूप से एक फ़ंक्शन (के बराबर) को कॉल करके किया जाता है। स्पष्ट विलोपन); विशेष रूप से, कई ऑब्जेक्ट-ओरिएंटेड भाषाएं [[निपटान पैटर्न]] का उपयोग करती हैं।


== विध्वंसक सिंटैक्स ==
== डिस्ट्रक्टर सिंटैक्स ==
* [[सी ++]]: विनाशकों के पास वही नाम होता है जिसके साथ वे जुड़े होते हैं, लेकिन एक [[टिल्ड]] (~) उपसर्ग के साथ।<ref name=SebestaLanguages />* [[डी (प्रोग्रामिंग भाषा)]]: विनाशकों को नाम से घोषित किया जाता है <code>~this()</code> (जबकि कंस्ट्रक्टर्स को घोषित किया जाता है <code>this()</code>).
* [[सी ++]]: विनाशकों के पास वही नाम होता है जिसके साथ वे जुड़े होते हैं, लेकिन एक [[टिल्ड]] (~) उपसर्ग के साथ।<ref name=SebestaLanguages />* [[डी (प्रोग्रामिंग भाषा)]]: विनाशकों को नाम से घोषित किया जाता है <code>~this()</code> (जबकि कंस्ट्रक्टर्स को घोषित किया जाता है <code>this()</code>).
* [[वस्तु पास्कल]]: डिस्ट्रक्टर्स के पास कीवर्ड होता है <code>destructor</code> और उपयोक्ता परिभाषित नाम हो सकते हैं, लेकिन ज्यादातर नाम हैं <code>Destroy</code>.
* [[वस्तु पास्कल]]: डिस्ट्रक्टर्स के पास कीवर्ड होता है <code>destructor</code> और उपयोक्ता परिभाषित नाम हो सकते हैं, लेकिन ज्यादातर नाम हैं <code>Destroy</code>.
* [[उद्देश्य सी]]: डिस्ट्रक्टर मेथड का नाम है <code>dealloc</code>.
* [[उद्देश्य सी]]: डिस्ट्रक्टर मेथड का नाम है <code>dealloc</code>.
* [[पर्ल]]: विध्वंसक विधि का नाम है <code>DESTROY</code>; [[मूस (पर्ल)]] में इसका नाम है <code>DEMOLISH</code>.
* [[पर्ल]]: डिस्ट्रक्टर विधि का नाम है <code>DESTROY</code>; [[मूस (पर्ल)]] में इसका नाम है <code>DEMOLISH</code>.
* [[PHP]]: PHP 5+ में, विध्वंसक विधि का नाम है <code>__destruct</code>. PHP के पूर्व संस्करणों में कोई विध्वंसक नहीं थे।<ref name="php5cpnstructor">[http://www.php.net/manual/en/language.oop5.decon.php Constructors and Destructors], from PHP online documentation</ref>
* [[PHP]]: PHP 5+ में, डिस्ट्रक्टर विधि का नाम है <code>__destruct</code>. PHP के पूर्व संस्करणों में कोई डिस्ट्रक्टर नहीं थे।<ref name="php5cpnstructor">[http://www.php.net/manual/en/language.oop5.decon.php Constructors and Destructors], from PHP online documentation</ref>
* [[पायथन (प्रोग्रामिंग भाषा)]]: वहाँ हैं <code>__del__</code> पायथन 2 लैंग्वेज गाइड द्वारा डिस्ट्रक्टर्स कहे जाने वाले तरीके,<ref>{{Cite web | url=https://docs.python.org/2/reference/datamodel.html#object.__del__ | title=3. Data model — Python 2.7.18 documentation }}</ref> लेकिन वे वास्तव में फाइनलाइज़र हैं जैसा कि पायथन 3 में स्वीकार किया गया है।<ref>{{Cite web | url=https://docs.python.org/3/reference/datamodel.html#object.__del__ | title=3. Data model — Python 3.10.4 documentation }}</ref>
* [[पायथन (प्रोग्रामिंग भाषा)]]: वहाँ हैं <code>__del__</code> पायथन 2 लैंग्वेज गाइड द्वारा डिस्ट्रक्टर्स कहे जाने वाले तरीके,<ref>{{Cite web | url=https://docs.python.org/2/reference/datamodel.html#object.__del__ | title=3. Data model — Python 2.7.18 documentation }}</ref> लेकिन वे वास्तव में फाइनलाइज़र हैं जैसा कि पायथन 3 में स्वीकार किया गया है।<ref>{{Cite web | url=https://docs.python.org/3/reference/datamodel.html#object.__del__ | title=3. Data model — Python 3.10.4 documentation }}</ref>
* [[जंग (प्रोग्रामिंग भाषा)]]: जंग के लिए विनाशक विधि का नाम है <code>drop</code> <ref>{{Cite web | url=https://doc.rust-lang.org/stable/reference/destructors.html | title=Destructors - the Rust Reference }}</ref>
* [[जंग (प्रोग्रामिंग भाषा)]]: जंग के लिए विनाशक विधि का नाम है <code>drop</code> <ref>{{Cite web | url=https://doc.rust-lang.org/stable/reference/destructors.html | title=Destructors - the Rust Reference }}</ref>
Line 14: Line 14:


== सी ++ == में
== सी ++ == में
विध्वंसक का नाम वर्ग के समान है, लेकिन इसके पहले एक टिल्ड (~) है।<ref name=SebestaLanguages />उदाहरण के लिए, फू नामक वर्ग में विध्वंसक होगा {{cpp|~foo()}}. इसके अतिरिक्त, विनाशकों के पास न तो पैरामीटर हैं और न ही रिटर्न प्रकार।<ref name=SebestaLanguages />जैसा कि ऊपर कहा गया है, जब भी वस्तु का जीवनकाल समाप्त होता है, तो किसी वस्तु के लिए विध्वंसक कहा जाता है।<ref name=SebestaLanguages />यदि वस्तु को एक [[स्वचालित चर]] के रूप में बनाया गया था, तो उसका जीवनकाल समाप्त हो जाता है और वस्तु के दायरे से बाहर जाने पर विध्वंसक को स्वचालित रूप से कहा जाता है। क्योंकि C++ में गारबेज कलेक्शन नहीं है, यदि ऑब्जेक्ट a के साथ बनाया गया था <code>[[new and delete (C++)|{{cpp|new}}]]</code> कथन (गतिशील रूप से मेमोरी प्रबंधन #HEAP पर), तो इसके विध्वंसक को तब कहा जाता है जब <code>[[delete (C++)|{{cpp|delete}}]]</code> ऑपरेटर को ऑब्जेक्ट के पॉइंटर पर लागू किया जाता है। सामान्यतः यह ऑपरेशन किसी अन्य विनाशक के भीतर होता है, सामान्यतः [[स्मार्ट सूचक]] ऑब्जेक्ट का विनाशक।
डिस्ट्रक्टर का नाम वर्ग के समान है, लेकिन इसके पहले एक टिल्ड (~) है।<ref name=SebestaLanguages />उदाहरण के लिए, फू नामक वर्ग में डिस्ट्रक्टर होगा {{cpp|~foo()}}. इसके अतिरिक्त, विनाशकों के पास न तो पैरामीटर हैं और न ही रिटर्न प्रकार।<ref name=SebestaLanguages />जैसा कि ऊपर कहा गया है, जब भी वस्तु का जीवनकाल समाप्त होता है, तो किसी वस्तु के लिए डिस्ट्रक्टर कहा जाता है।<ref name=SebestaLanguages />यदि वस्तु को एक [[स्वचालित चर]] के रूप में बनाया गया था, तो उसका जीवनकाल समाप्त हो जाता है और वस्तु के दायरे से बाहर जाने पर डिस्ट्रक्टर को स्वचालित रूप से कहा जाता है। क्योंकि C++ में गारबेज कलेक्शन नहीं है, यदि ऑब्जेक्ट a के साथ बनाया गया था <code>[[new and delete (C++)|{{cpp|new}}]]</code> कथन (गतिशील रूप से मेमोरी प्रबंधन #HEAP पर), तो इसके डिस्ट्रक्टर को तब कहा जाता है जब <code>[[delete (C++)|{{cpp|delete}}]]</code> ऑपरेटर को ऑब्जेक्ट के पॉइंटर पर लागू किया जाता है। सामान्यतः यह ऑपरेशन किसी अन्य विनाशक के भीतर होता है, सामान्यतः [[स्मार्ट सूचक]] ऑब्जेक्ट का विनाशक।


वंशानुक्रम पदानुक्रम में, वर्चुअल फ़ंक्शन # बेस क्लास में वर्चुअल डिस्ट्रक्टर्स की घोषणा यह सुनिश्चित करती है कि पॉइंटर-टू-बेस-क्लास के माध्यम से किसी ऑब्जेक्ट को हटाए जाने पर व्युत्पन्न कक्षाओं के विनाशकों को ठीक से लागू किया जाता है। जिन वस्तुओं को इस प्रकार से हटाया जा सकता है, उन्हें एक आभासी विध्वंसक को इनहेरिट करने की आवश्यकता है।
वंशानुक्रम पदानुक्रम में, वर्चुअल फ़ंक्शन # बेस क्लास में वर्चुअल डिस्ट्रक्टर्स की घोषणा यह सुनिश्चित करती है कि पॉइंटर-टू-बेस-क्लास के माध्यम से किसी ऑब्जेक्ट को हटाए जाने पर व्युत्पन्न कक्षाओं के विनाशकों को ठीक से लागू किया जाता है। जिन वस्तुओं को इस प्रकार से हटाया जा सकता है, उन्हें एक आभासी डिस्ट्रक्टर को इनहेरिट करने की आवश्यकता है।


एक विनाशक को कभी अपवाद नहीं फेंकना चाहिए।<ref>[http://www.gotw.ca/gotw/047.htm GotW #47: Uncaught exceptions] Accessed 31 July 2011.</ref>
एक विनाशक को कभी अपवाद नहीं फेंकना चाहिए।<ref>[http://www.gotw.ca/gotw/047.htm GotW #47: Uncaught exceptions] Accessed 31 July 2011.</ref>
Line 68: Line 68:
== जीसीसी एक्सटेंशन के साथ सी में ==
== जीसीसी एक्सटेंशन के साथ सी में ==
[[जीएनयू संकलक संग्रह]] का C (प्रोग्रामिंग लैंग्वेज) कंपाइलर 2 एक्सटेंशन के साथ आता है जो डिस्ट्रक्टर्स को लागू करने की अनुमति देता है:
[[जीएनयू संकलक संग्रह]] का C (प्रोग्रामिंग लैंग्वेज) कंपाइलर 2 एक्सटेंशन के साथ आता है जो डिस्ट्रक्टर्स को लागू करने की अनुमति देता है:
* <code>destructor</code> ई> फ़ंक्शन विशेषता<ref>[https://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html#Function-Attributes C "destructor" function attribute]</ref> वैश्विक प्राथमिकता वाले विध्वंसक कार्यों को परिभाषित करने की अनुमति देता है: कब <code>main()</code> रिटर्न, प्रक्रिया समाप्त होने से पहले इन कार्यों को प्राथमिकता क्रम में कहा जाता है। यह भी देखें: शोषण की कला को हैक करना।<ref>{{cite book
* <code>destructor</code> ई> फ़ंक्शन विशेषता<ref>[https://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html#Function-Attributes C "destructor" function attribute]</ref> वैश्विक प्राथमिकता वाले डिस्ट्रक्टर कार्यों को परिभाषित करने की अनुमति देता है: कब <code>main()</code> रिटर्न, प्रक्रिया समाप्त होने से पहले इन कार्यों को प्राथमिकता क्रम में कहा जाता है। यह भी देखें: शोषण की कला को हैक करना।<ref>{{cite book
  |last = Erickson
  |last = Erickson
  |first = Jon
  |first = Jon
Line 76: Line 76:
  |isbn = 978-1-59327-144-2
  |isbn = 978-1-59327-144-2
}}</ref>
}}</ref>
* संसाधन अधिग्रहण आरंभीकरण है # Clang और C के लिए GCC क्लीनअप एक्सटेंशन एक विध्वंसक फ़ंक्शन को एक चर के साथ संलग्न करने की अनुमति देता है: फ़ंक्शन को तब कहा जाता है जब चर दायरे से बाहर हो जाता है।
* संसाधन अधिग्रहण आरंभीकरण है # Clang और C के लिए GCC क्लीनअप एक्सटेंशन एक डिस्ट्रक्टर फ़ंक्शन को एक चर के साथ संलग्न करने की अनुमति देता है: फ़ंक्शन को तब कहा जाता है जब चर दायरे से बाहर हो जाता है।


== ज़ोजो ==
== ज़ोजो ==
Line 87: Line 87:
   
   
   // नए रूप मे
   // नए रूप मे
   उप विध्वंसक ()
   उप डिस्ट्रक्टर ()
   अंत उप
   अंत उप
  अंत वर्ग
  अंत वर्ग

Revision as of 09:11, 24 March 2023

वस्तु-उन्मुख प्रोग्रामिंग में, एक डिस्ट्रक्टर (कभी-कभी संक्षिप्त रूप में डीटोर[1]) एक विधि (कंप्यूटर विज्ञान) है जिसे वस्तु (कंप्यूटर विज्ञान) की मेमोरी जारी होने से ठीक पहले यांत्रिक रूप से लागू किया जाता है।[2] यह तब हो सकता है जब इसका वस्तु जीवनकाल स्कोप (कंप्यूटर साइंस) से जुड़ा हो और निष्पादन स्कोप छोड़ देता है, जब यह किसी अन्य ऑब्जेक्ट में एम्बेड किया जाता है जिसका जीवनकाल समाप्त हो जाता है, या जब यह मेमोरी मैनेजमेंट मैनुअल मेमोरी मैनेजमेंट था और स्पष्ट रूप से जारी किया गया था। इसका मुख्य उद्देश्य संसाधन (कंप्यूटर विज्ञान) (स्मृति आवंटन, खुली फ़ाइलें या सॉकेट, डेटाबेस कनेक्शन, संसाधन ताले, आदि) को मुक्त करना है, जो वस्तु द्वारा उसके जीवन के समय अधिग्रहित किए गए थे और/या अन्य संस्थाओं से अपंजीकृत हो सकते हैं जो संदर्भ रख सकते हैं इसे। संसाधन अधिग्रहण प्रारंभ है (RAII) की प्रक्रिया के लिए डिस्ट्रक्टर्स के उपयोग की आवश्यकता है।

अधिकांश प्रकार के कचरा संग्रह (कंप्यूटर विज्ञान) एल्गोरिदम के साथ, ऑब्जेक्ट के अगम्य हो जाने के बाद लंबे समय तक मेमोरी रिलीज़ हो सकती है, जिससे डिस्ट्रक्टर्स (इस स्थिति में finalizer कहलाते हैं) अधिकांश उद्देश्यों के लिए अनुपयुक्त हो जाते हैं। ऐसी भाषाओं में, संसाधनों को मुक्त करना या तो एक शाब्दिक निर्माण के माध्यम से किया जाता है (जैसे कि try..अंत में, Python's with या Java के try-with-resources), जो कि RAII के समतुल्य है, या स्पष्ट रूप से एक फ़ंक्शन (के बराबर) को कॉल करके किया जाता है। स्पष्ट विलोपन); विशेष रूप से, कई ऑब्जेक्ट-ओरिएंटेड भाषाएं निपटान पैटर्न का उपयोग करती हैं।

डिस्ट्रक्टर सिंटैक्स

  • सी ++: विनाशकों के पास वही नाम होता है जिसके साथ वे जुड़े होते हैं, लेकिन एक टिल्ड (~) उपसर्ग के साथ।[2]* डी (प्रोग्रामिंग भाषा): विनाशकों को नाम से घोषित किया जाता है ~this() (जबकि कंस्ट्रक्टर्स को घोषित किया जाता है this()).
  • वस्तु पास्कल: डिस्ट्रक्टर्स के पास कीवर्ड होता है destructor और उपयोक्ता परिभाषित नाम हो सकते हैं, लेकिन ज्यादातर नाम हैं Destroy.
  • उद्देश्य सी: डिस्ट्रक्टर मेथड का नाम है dealloc.
  • पर्ल: डिस्ट्रक्टर विधि का नाम है DESTROY; मूस (पर्ल) में इसका नाम है DEMOLISH.
  • PHP: PHP 5+ में, डिस्ट्रक्टर विधि का नाम है __destruct. PHP के पूर्व संस्करणों में कोई डिस्ट्रक्टर नहीं थे।[3]
  • पायथन (प्रोग्रामिंग भाषा): वहाँ हैं __del__ पायथन 2 लैंग्वेज गाइड द्वारा डिस्ट्रक्टर्स कहे जाने वाले तरीके,[4] लेकिन वे वास्तव में फाइनलाइज़र हैं जैसा कि पायथन 3 में स्वीकार किया गया है।[5]
  • जंग (प्रोग्रामिंग भाषा): जंग के लिए विनाशक विधि का नाम है drop [6]
  • स्विफ्ट (प्रोग्रामिंग भाषा): डिस्ट्रक्टर मेथड का नाम है deinit.

== सी ++ == में डिस्ट्रक्टर का नाम वर्ग के समान है, लेकिन इसके पहले एक टिल्ड (~) है।[2]उदाहरण के लिए, फू नामक वर्ग में डिस्ट्रक्टर होगा ~foo(). इसके अतिरिक्त, विनाशकों के पास न तो पैरामीटर हैं और न ही रिटर्न प्रकार।[2]जैसा कि ऊपर कहा गया है, जब भी वस्तु का जीवनकाल समाप्त होता है, तो किसी वस्तु के लिए डिस्ट्रक्टर कहा जाता है।[2]यदि वस्तु को एक स्वचालित चर के रूप में बनाया गया था, तो उसका जीवनकाल समाप्त हो जाता है और वस्तु के दायरे से बाहर जाने पर डिस्ट्रक्टर को स्वचालित रूप से कहा जाता है। क्योंकि C++ में गारबेज कलेक्शन नहीं है, यदि ऑब्जेक्ट a के साथ बनाया गया था new कथन (गतिशील रूप से मेमोरी प्रबंधन #HEAP पर), तो इसके डिस्ट्रक्टर को तब कहा जाता है जब delete ऑपरेटर को ऑब्जेक्ट के पॉइंटर पर लागू किया जाता है। सामान्यतः यह ऑपरेशन किसी अन्य विनाशक के भीतर होता है, सामान्यतः स्मार्ट सूचक ऑब्जेक्ट का विनाशक।

वंशानुक्रम पदानुक्रम में, वर्चुअल फ़ंक्शन # बेस क्लास में वर्चुअल डिस्ट्रक्टर्स की घोषणा यह सुनिश्चित करती है कि पॉइंटर-टू-बेस-क्लास के माध्यम से किसी ऑब्जेक्ट को हटाए जाने पर व्युत्पन्न कक्षाओं के विनाशकों को ठीक से लागू किया जाता है। जिन वस्तुओं को इस प्रकार से हटाया जा सकता है, उन्हें एक आभासी डिस्ट्रक्टर को इनहेरिट करने की आवश्यकता है।

एक विनाशक को कभी अपवाद नहीं फेंकना चाहिए।[7] गैर-श्रेणी के अदिश प्रकारों को a कहा जाता है pseudo-destructor जिसका उपयोग करके पहुँचा जा सकता है typedef या टेम्पलेट तर्क। यह निर्माण किसी दिए गए प्रकार के लिए विनाशक उपलब्ध है या नहीं, यह जानने के बिना कोड लिखना संभव बनाता है। <वाक्यविन्यास लैंग = सीपीपी> इंट एफ () {

 इंट ए = 123;
 टी = इंट का उपयोग करना;
 ए ~ टी ();
 वापसी ए; // अपरिभाषित व्यवहार

} </वाक्यविन्यास हाइलाइट>

मानक के प्राचीन संस्करणों में, छद्म-विनाशकों को कोई प्रभाव नहीं होने के लिए निर्दिष्ट किया गया था, चूंकि उन्हें उस वस्तु के जीवनकाल को समाप्त करने के लिए एक दोष रिपोर्ट में बदल दिया गया था जिस पर उन्हें बुलाया गया था।[8]


उदाहरण

<वाक्यविन्यास लैंग = सीपीपी>

  1. सम्मलित <सीस्ट्रिंग>
  2. सम्मलित <iostream>

कक्षा फू { जनता:

 फू (): डेटा_ (नवीनतम चार [बनावट (हैलो, वर्ल्ड!)]) {
 एसटीडी�:: strcpy (डेटा_, हैलो, वर्ल्ड!);
 }
 फू (स्थिरांक फू और अन्य) = हटाएं; // कॉपी निर्माण अक्षम करें
 फू और ऑपरेटर = (स्थिर फू और अन्य) = हटाएं; // असाइनमेंट अक्षम करें
 ~ फू (शून्य) {हटाएं [] डेटा_; }

निजी:

 मित्र एसटीडी :: ओस्ट्रीम और ऑपरेटर << (एसटीडी :: ओस्ट्रीम और ओएस, कास्ट फू और फू) {
 ओएस << foo.data_;
 वापसी ओएस;
 }
 चार * डेटा_;

};

मुख्य प्रवेश बिंदु() {

 फू फू;
 एसटीडी�:: अदालत << फू << एसटीडी�:: एंडएल;

} </वाक्यविन्यास हाइलाइट> जिन वस्तुओं को सुरक्षित रूप से कॉपी और / या असाइन नहीं किया जा सकता है, उन्हें सार्वजनिक इनकैप्सुलेशन स्तर के भीतर हटाए गए उनके संबंधित कार्यों को घोषित करके इस प्रकार के शब्दार्थ से अक्षम किया जाना चाहिए। इस पद्धति का विस्तृत विवरण स्कॉट मेयर्स की लोकप्रिय पुस्तक, प्रभावी आधुनिक सी ++ (आइटम 11: निजी अपरिभाषित लोगों को हटाए गए कार्यों को प्राथमिकता दें) में पाया जा सकता है।[9]).

जीसीसी एक्सटेंशन के साथ सी में

जीएनयू संकलक संग्रह का C (प्रोग्रामिंग लैंग्वेज) कंपाइलर 2 एक्सटेंशन के साथ आता है जो डिस्ट्रक्टर्स को लागू करने की अनुमति देता है:

  • destructor ई> फ़ंक्शन विशेषता[10] वैश्विक प्राथमिकता वाले डिस्ट्रक्टर कार्यों को परिभाषित करने की अनुमति देता है: कब main() रिटर्न, प्रक्रिया समाप्त होने से पहले इन कार्यों को प्राथमिकता क्रम में कहा जाता है। यह भी देखें: शोषण की कला को हैक करना।[11]
  • संसाधन अधिग्रहण आरंभीकरण है # Clang और C के लिए GCC क्लीनअप एक्सटेंशन एक डिस्ट्रक्टर फ़ंक्शन को एक चर के साथ संलग्न करने की अनुमति देता है: फ़ंक्शन को तब कहा जाता है जब चर दायरे से बाहर हो जाता है।

ज़ोजो

Xojo (REALbasic) में विनाशक दो रूपों में से एक में हो सकते हैं। प्रत्येक प्रपत्र एक विशेष नाम के साथ एक नियमित विधि घोषणा का उपयोग करता है (कोई पैरामीटर नहीं और कोई वापसी मान नहीं)। पुराना रूप ~ (टिल्डे) उपसर्ग के साथ कक्षा के समान नाम का उपयोग करता है। नवीनतम रूप नाम का उपयोग करता है Destructor. नए फॉर्म को प्राथमिकता दी जाती है क्योंकि यह कोड कोड रीफैक्टरिंग क्लास को आसान बनाता है।

वर्ग फूबर
 // पुराना रूप
 उप ~ फूबार ()
 अंत उप

 // नए रूप मे
 उप डिस्ट्रक्टर ()
 अंत उप
अंत वर्ग

यह भी देखें

संदर्भ

  1. "झाड़ी". TheFreeDictionary.com. Retrieved 2018-10-14.
  2. 2.0 2.1 2.2 2.3 2.4 Sebesta, Robert W. (2012). ""11.4.2.3 Constructors and Destructors"". Concepts of Programming Languages (print) (in English) (10th ed.). Boston, MA, USA: Addison-Wesley. p. 487. ISBN 978-0-13-139531-2.
  3. Constructors and Destructors, from PHP online documentation
  4. "3. Data model — Python 2.7.18 documentation".
  5. "3. Data model — Python 3.10.4 documentation".
  6. "Destructors - the Rust Reference".
  7. GotW #47: Uncaught exceptions Accessed 31 July 2011.
  8. Smith, Richard; Voutilainen, Ville. "P0593R6:Implicit creation of objects for low-level object manipulation". open-std.org. Retrieved 2022-11-25.
  9. Scott Meyers: Effective Modern C++, O'REILLY, ISBN 9781491903995
  10. C "destructor" function attribute
  11. Erickson, Jon (2008). Hacking the art of exploitation. No Starch Press. ISBN 978-1-59327-144-2.