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

From Vigyanwiki
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) की प्रक्रिया के लिए डिस्ट्रक्टर्स के उपयोग की आवश्यकता है।
वस्तु-उन्मुख प्रोग्रामिंग में, एक विध्वंसक (कभी-कभी संक्षिप्त रूप में 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) की प्रक्रिया के लिए डिस्ट्रक्टर्स के उपयोग की आवश्यकता है।


अधिकांश प्रकार के [[कचरा संग्रह (कंप्यूटर विज्ञान)]] एल्गोरिदम के साथ<!-- 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 के समतुल्य है, या स्पष्ट रूप से एक फ़ंक्शन (के बराबर) को कॉल करके किया जाता है। स्पष्ट विलोपन); विशेष रूप से, कई ऑब्जेक्ट-ओरिएंटेड भाषाएं [[निपटान पैटर्न]] का उपयोग करती हैं।
अधिकांश प्रकार के [[कचरा संग्रह (कंप्यूटर विज्ञान)]] एल्गोरिदम के साथ<!-- 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 के समतुल्य है, या स्पष्ट रूप से एक फ़ंक्शन (के बराबर) को कॉल करके किया जाता है। स्पष्ट विलोपन); विशेष रूप से, कई ऑब्जेक्ट-ओरिएंटेड भाषाएं [[निपटान पैटर्न]] का उपयोग करती हैं।


== विध्वंसक सिंटैक्स ==
== विध्वंसक सिंटैक्स ==
Line 9: Line 9:
* [[पर्ल]]: विध्वंसक विधि का नाम है <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>
* [[स्विफ्ट (प्रोग्रामिंग भाषा)]]: डिस्ट्रक्टर मेथड का नाम है <code>deinit</code>.
* [[स्विफ्ट (प्रोग्रामिंग भाषा)]]: डिस्ट्रक्टर मेथड का नाम है <code>deinit</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 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>
गैर-श्रेणी के [[अदिश प्रकार]]ों को a कहा जाता है {{visible anchor|pseudo-destructor}} जिसका उपयोग करके पहुँचा जा सकता है <code>typedef</code> या टेम्पलेट तर्क। यह निर्माण किसी दिए गए प्रकार के लिए विनाशक मौजूद है या नहीं, यह जानने के बिना कोड लिखना संभव बनाता है।
गैर-श्रेणी के [[अदिश प्रकार]]ों को a कहा जाता है {{visible anchor|pseudo-destructor}} जिसका उपयोग करके पहुँचा जा सकता है <code>typedef</code> या टेम्पलेट तर्क। यह निर्माण किसी दिए गए प्रकार के लिए विनाशक उपलब्ध है या नहीं, यह जानने के बिना कोड लिखना संभव बनाता है।
<वाक्यविन्यास लैंग = सीपीपी>
<वाक्यविन्यास लैंग = सीपीपी>
इंट एफ () {
इंट एफ () {
    इंट ए = 123;
  इंट ए = 123;
    टी = इंट का उपयोग करना;
  टी = इंट का उपयोग करना;
    ए ~ टी ();
  ए ~ टी ();
    वापसी ए; // अपरिभाषित व्यवहार
  वापसी ए; // अपरिभाषित व्यवहार
}
}
</वाक्यविन्यास हाइलाइट>
</वाक्यविन्यास हाइलाइट>


मानक के पुराने संस्करणों में, छद्म-विनाशकों को कोई प्रभाव नहीं होने के लिए निर्दिष्ट किया गया था, हालांकि उन्हें उस वस्तु के जीवनकाल को समाप्त करने के लिए एक दोष रिपोर्ट में बदल दिया गया था जिस पर उन्हें बुलाया गया था।<ref>{{cite web|url=https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/p0593r6.html|title=
मानक के प्राचीन संस्करणों में, छद्म-विनाशकों को कोई प्रभाव नहीं होने के लिए निर्दिष्ट किया गया था, चूंकि उन्हें उस वस्तु के जीवनकाल को समाप्त करने के लिए एक दोष रिपोर्ट में बदल दिया गया था जिस पर उन्हें बुलाया गया था।<ref>{{cite web|url=https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/p0593r6.html|title=
P0593R6:Implicit creation of objects for low-level object manipulation|last1=Smith|first1=Richard|last2=Voutilainen|first2=Ville
P0593R6:Implicit creation of objects for low-level object manipulation|last1=Smith|first1=Richard|last2=Voutilainen|first2=Ville
|accessdate=2022-11-25|website=open-std.org}}</ref>
|accessdate=2022-11-25|website=open-std.org}}</ref>
Line 36: Line 36:
=== उदाहरण ===
=== उदाहरण ===
<वाक्यविन्यास लैंग = सीपीपी>
<वाक्यविन्यास लैंग = सीपीपी>
#शामिल <सीस्ट्रिंग>
#सम्मलित <सीस्ट्रिंग>
#शामिल <iostream>
#सम्मलित <iostream>


कक्षा फू {
कक्षा फू {
जनता:
जनता:
    फू (): डेटा_ (नया चार [आकार (हैलो, वर्ल्ड!)]) {
  फू (): डेटा_ (नवीनतम चार [बनावट (हैलो, वर्ल्ड!)]) {
        एसटीडी :: strcpy (डेटा_, हैलो, वर्ल्ड!);
  एसटीडी�:: strcpy (डेटा_, हैलो, वर्ल्ड!);
    }
  }


    फू (स्थिरांक फू और अन्य) = हटाएं; // कॉपी निर्माण अक्षम करें
  फू (स्थिरांक फू और अन्य) = हटाएं; // कॉपी निर्माण अक्षम करें
    फू और ऑपरेटर = (स्थिर फू और अन्य) = हटाएं; // असाइनमेंट अक्षम करें
  फू और ऑपरेटर = (स्थिर फू और अन्य) = हटाएं; // असाइनमेंट अक्षम करें


    ~ फू (शून्य) {हटाएं [] डेटा_; }
  ~ फू (शून्य) {हटाएं [] डेटा_; }


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


    चार * डेटा_;
  चार * डेटा_;
};
};


मुख्य प्रवेश बिंदु() {
मुख्य प्रवेश बिंदु() {
    फू फू;
  फू फू;
    एसटीडी :: अदालत << फू << एसटीडी :: एंडएल;
  एसटीडी�:: अदालत << फू << एसटीडी�:: एंडएल;
}
}
</वाक्यविन्यास हाइलाइट>
</वाक्यविन्यास हाइलाइट>
जिन वस्तुओं को सुरक्षित रूप से कॉपी और / या असाइन नहीं किया जा सकता है, उन्हें सार्वजनिक इनकैप्सुलेशन स्तर के भीतर हटाए गए उनके संबंधित कार्यों को घोषित करके इस तरह के शब्दार्थ से अक्षम किया जाना चाहिए। इस पद्धति का विस्तृत विवरण [[स्कॉट मेयर्स]] की लोकप्रिय पुस्तक, प्रभावी आधुनिक सी ++ (आइटम 11: निजी अपरिभाषित लोगों को हटाए गए कार्यों को प्राथमिकता दें) में पाया जा सकता है।<ref>Scott Meyers: ''Effective Modern C++'', O'REILLY, {{ISBN|9781491903995}}</ref>).
जिन वस्तुओं को सुरक्षित रूप से कॉपी और / या असाइन नहीं किया जा सकता है, उन्हें सार्वजनिक इनकैप्सुलेशन स्तर के भीतर हटाए गए उनके संबंधित कार्यों को घोषित करके इस प्रकार के शब्दार्थ से अक्षम किया जाना चाहिए। इस पद्धति का विस्तृत विवरण [[स्कॉट मेयर्स]] की लोकप्रिय पुस्तक, प्रभावी आधुनिक सी ++ (आइटम 11: निजी अपरिभाषित लोगों को हटाए गए कार्यों को प्राथमिकता दें) में पाया जा सकता है।<ref>Scott Meyers: ''Effective Modern C++'', O'REILLY, {{ISBN|9781491903995}}</ref>).


== जीसीसी एक्सटेंशन के साथ सी में ==
== जीसीसी एक्सटेंशन के साथ सी में ==
Line 79: Line 79:


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


  वर्ग फूबर
  वर्ग फूबर
  // पुराना रूप
  // पुराना रूप
  उप ~ फूबार ()
  उप ~ फूबार ()
  अंत उप
  अंत उप
   
   
  // नए रूप मे
  // नए रूप मे
  उप विध्वंसक ()
  उप विध्वंसक ()
  अंत उप
  अंत उप
  अंत वर्ग
  अंत वर्ग



Revision as of 22:51, 23 March 2023

वस्तु-उन्मुख प्रोग्रामिंग में, एक विध्वंसक (कभी-कभी संक्षिप्त रूप में dtor[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.