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

From Vigyanwiki
No edit summary
No edit summary
 
(4 intermediate revisions by 3 users not shown)
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> यह तब हो सकता है जब इसका [[वस्तु जीवनकाल|ऑब्जेक्ट जीवनकाल]] [[स्कोप (कंप्यूटर साइंस)]] से जुड़ा हो और यह निष्पादन स्कोप छोड़ देता हो, यह किसी अन्य ऑब्जेक्ट में एम्बेड किया जाता है जिसका जीवनकाल समाप्त हो जाता है, या जब यह मेमोरी मैनेजमेंट मैनुअल मेमोरी मैनेजमेंट हो जाता है और इसे स्पष्ट रूप से जारी किया गया था, इसका मुख्य उद्देश्य [[संसाधन (कंप्यूटर विज्ञान)]] (स्मृति आवंटन, खुली फ़ाइलें या सॉकेट, [[डेटाबेस कनेक्शन]], संसाधन ताले, आदि) को मुक्त करना है, जो ऑब्जेक्ट द्वारा उसके जीवन के समय अधिग्रहित किए गए थे और/या अन्य संस्थाओं से अपंजीकृत हो सकते हैं जो इसे संदर्भ रख सकते हैं। [[संसाधन अधिग्रहण प्रारंभ है]] (आरऐआईआई) की प्रक्रिया के लिए डिस्ट्रक्टर्स के उपयोग की आवश्यकता है।


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


== विध्वंसक सिंटैक्स ==
== डिस्ट्रक्टर सिंटैक्स ==
* [[सी ++]]: विनाशकों के पास वही नाम होता है जिसके साथ वे जुड़े होते हैं, लेकिन एक [[टिल्ड]] (~) उपसर्ग के साथ।<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>डिस्ट्रक्टर</code> और उपयोक्ता परिभाषित नाम हो सकते हैं, लेकिन अधिकांशतः <code>डिस्ट्रॉय</code>नाम हैं।
* [[उद्देश्य सी]]: डिस्ट्रक्टर मेथड का नाम है <code>dealloc</code>.
* [[उद्देश्य सी]]: डिस्ट्रक्टर मेथड का नाम है।<code>डीऐलौक</code>
* [[पर्ल]]: विध्वंसक विधि का नाम है <code>DESTROY</code>; [[मूस (पर्ल)]] में इसका नाम है <code>DEMOLISH</code>.
* [[पर्ल]]: डिस्ट्रक्टर विधि का नाम है <code>डिस्ट्रॉय</code>; [[मूस (पर्ल)]] में इसका नाम <code>डीमॉलिश</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>__डिस्ट्रक्ट</code> , पीएचपी के पूर्व संस्करणों में कोई डिस्ट्रक्टर नहीं थे।<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>__डेल__</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>ड्राप</code>है <ref>{{Cite web | url=https://doc.rust-lang.org/stable/reference/destructors.html | title=Destructors - the Rust Reference }}</ref>
* [[स्विफ्ट (प्रोग्रामिंग भाषा)]]: डिस्ट्रक्टर मेथड का नाम है <code>deinit</code>.
* [[स्विफ्ट (प्रोग्रामिंग भाषा)]]: डिस्ट्रक्टर मेथड का नाम<code>डेनिट</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> कथन (गतिशील रूप से मेमोरी प्रबंधन एचइऐपी पर) गया था, तो इसके डिस्ट्रक्टर को तब कहा जाता है जब <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 कहा जाता है छद्म डिस्ट्रक्टर जिसका उपयोग करके पहुँचा जा सकता है <code>typedef</code> या टेम्पलेट तर्क यह निर्माण किसी दिए गए प्रकार के लिए डिस्ट्रक्टर उपलब्ध है या नहीं, यह जानने के बिना कोड लिखना संभव बनाता है।<syntaxhighlight lang="c">
इंट एफ () {
int f() {
  इंट ए = 123;
    int a = 123;
  टी = इंट का उपयोग करना;
    using T = int;
  ए ~ टी ();
    a.~T();
  वापसी ए; // अपरिभाषित व्यवहार
    return a; // undefined behavior
}
}
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>मानक के प्राचीन संस्करणों में, छद्म-डिस्ट्रक्टर को कोई प्रभाव नहीं होने के लिए निर्दिष्ट किया गया था, चूंकि उन्हें उस ऑब्जेक्ट के जीवनकाल को समाप्त करने के लिए एक दोष रिपोर्ट में बदल दिया गया था जिस पर उन्हें बुलाया गया था।<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>
=== उदाहरण ===
=== उदाहरण ===
<वाक्यविन्यास लैंग = सीपीपी>
<syntaxhighlight lang="c">
#सम्मलित <सीस्ट्रिंग>
#include <cstring>
#सम्मलित <iostream>
#include <iostream>


कक्षा फू {
class Foo {
जनता:
public:
  फू (): डेटा_ (नवीनतम चार [बनावट (हैलो, वर्ल्ड!)]) {
    Foo(): data_(new char[sizeof("Hello, World!")]) {
  एसटीडी�:: strcpy (डेटा_, हैलो, वर्ल्ड!);
        std::strcpy(data_, "Hello, World!");
  }
    }


  फू (स्थिरांक फू और अन्य) = हटाएं; // कॉपी निर्माण अक्षम करें
    Foo(const Foo& other) = delete;             // disable copy construction
  फू और ऑपरेटर = (स्थिर फू और अन्य) = हटाएं; // असाइनमेंट अक्षम करें
    Foo& operator=(const Foo& other) = delete; // disable assignment


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


निजी:
private:
  मित्र एसटीडी :: ओस्ट्रीम और ऑपरेटर << (एसटीडी :: ओस्ट्रीम और ओएस, कास्ट फू और फू) {
    friend std::ostream& operator<<(std::ostream& os, const Foo& foo) {
  ओएस << foo.data_;
        os << foo.data_;
  वापसी ओएस;
        return os;
  }
    }


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


मुख्य प्रवेश बिंदु() {
int main() {
  फू फू;
    Foo foo;
  एसटीडी�:: अदालत << फू << एसटीडी�:: एंडएल;
    std::cout << foo << std::endl;
}
}
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>जिन ऑब्जेक्ट को सुरक्षित रूप से कॉपी या असाइन नहीं किया जा सकता है, उन्हें सार्वजनिक इनकैप्सुलेशन स्तर के भीतर हटाए गए उनके संबंधित कार्यों को घोषित करके इस प्रकार के शब्दार्थ से अक्षम किया जाना चाहिए, इस पद्धति का विस्तृत विवरण [[स्कॉट मेयर्स]] की लोकप्रिय पुस्तक, प्रभावी आधुनिक सी ++ (आइटम 11: निजी अपरिभाषित लोगों को हटाए गए कार्यों को प्राथमिकता दें) में पाया जा सकता है।<ref>Scott Meyers: ''Effective Modern C++'', O'REILLY, {{ISBN|9781491903995}}</ref>
जिन वस्तुओं को सुरक्षित रूप से कॉपी और / या असाइन नहीं किया जा सकता है, उन्हें सार्वजनिक इनकैप्सुलेशन स्तर के भीतर हटाए गए उनके संबंधित कार्यों को घोषित करके इस प्रकार के शब्दार्थ से अक्षम किया जाना चाहिए। इस पद्धति का विस्तृत विवरण [[स्कॉट मेयर्स]] की लोकप्रिय पुस्तक, प्रभावी आधुनिक सी ++ (आइटम 11: निजी अपरिभाषित लोगों को हटाए गए कार्यों को प्राथमिकता दें) में पाया जा सकता है।<ref>Scott Meyers: ''Effective Modern C++'', O'REILLY, {{ISBN|9781491903995}}</ref>).
 
== जीसीसी एक्सटेंशन के साथ सी में ==
== जीसीसी एक्सटेंशन के साथ सी में ==
[[जीएनयू संकलक संग्रह]] का C (प्रोग्रामिंग लैंग्वेज) कंपाइलर 2 एक्सटेंशन के साथ आता है जो डिस्ट्रक्टर्स को लागू करने की अनुमति देता है:
[[जीएनयू संकलक संग्रह]] का सी (प्रोग्रामिंग लैंग्वेज) कंपाइलर 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>डिस्ट्रक्टर</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 70:
  |isbn = 978-1-59327-144-2
  |isbn = 978-1-59327-144-2
}}</ref>
}}</ref>
* संसाधन अधिग्रहण आरंभीकरण है # Clang और C के लिए GCC क्लीनअप एक्सटेंशन एक विध्वंसक फ़ंक्शन को एक चर के साथ संलग्न करने की अनुमति देता है: फ़ंक्शन को तब कहा जाता है जब चर दायरे से बाहर हो जाता है।
* संसाधन अधिग्रहण आरंभीकरण है सीभाषा और सी के लिए [[जीएनयू संकलक संग्रह]] क्लीनअप एक्सटेंशन एक डिस्ट्रक्टर फ़ंक्शन को एक चर के साथ संलग्न करने की अनुमति देता है: फ़ंक्शन को तब कहा जाता है जब चर दायरे से बाहर हो जाता है।


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


वर्ग फूबर
   // New form
   // पुराना रूप
   Sub Destructor()
   उप ~ फूबार ()
   End Sub
   अंत उप
End Class
</syntaxhighlight>
  // नए रूप मे
  उप विध्वंसक ()
  अंत उप
अंत वर्ग


== यह भी देखें ==
== यह भी देखें ==
* फाइनलाइज़र
* फाइनलाइज़र
*निर्माता (कंप्यूटर विज्ञान)
*निर्माता (कंप्यूटर विज्ञान)
* वस्तु जीवनकाल
* ऑब्जेक्ट जीवनकाल
*संसाधन अधिग्रहण प्रारंभ है
*संसाधन अधिग्रहण प्रारंभ है
*[[तीन का नियम (C++ प्रोग्रामिंग)]]
*[[तीन का नियम (C++ प्रोग्रामिंग)]]
Line 100: Line 94:
== संदर्भ ==
== संदर्भ ==
{{Reflist}}
{{Reflist}}
[[Category: विधि (कंप्यूटर प्रोग्रामिंग)]] [[Category: सी ++]]


[[Category: Machine Translated Page]]
[[Category:CS1 English-language sources (en)]]
[[Category:Created On 19/02/2023]]
[[Category:Created On 19/02/2023]]
[[Category:Machine Translated Page]]
[[Category:Pages with script errors]]
[[Category:Templates Vigyan Ready]]
[[Category:विधि (कंप्यूटर प्रोग्रामिंग)]]
[[Category:सी ++]]

Latest revision as of 12:57, 7 April 2023

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

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

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

  • सी ++: डिस्ट्रक्टर के पास वही नाम होता है जिसके साथ वे जुड़े होते हैं, लेकिन एक टिल्ड (~) उपसर्ग के साथ[2] * डी (प्रोग्रामिंग भाषा): डिस्ट्रक्टर को ~this() नाम से घोषित किया जाता है (जबकि कंस्ट्रक्टर्स को मात्र this() से घोषित किया जाता है)।
  • ऑब्जेक्ट पास्कल: डिस्ट्रक्टर्स के पास कीवर्ड होता है डिस्ट्रक्टर और उपयोक्ता परिभाषित नाम हो सकते हैं, लेकिन अधिकांशतः डिस्ट्रॉयनाम हैं।
  • उद्देश्य सी: डिस्ट्रक्टर मेथड का नाम है।डीऐलौक
  • पर्ल: डिस्ट्रक्टर विधि का नाम है डिस्ट्रॉय; मूस (पर्ल) में इसका नाम डीमॉलिशहै।
  • PHP: PHP 5+ में, डिस्ट्रक्टर विधि का नाम है __डिस्ट्रक्ट , पीएचपी के पूर्व संस्करणों में कोई डिस्ट्रक्टर नहीं थे।[3]
  • पायथन (प्रोग्रामिंग भाषा): वहाँ हैं __डेल__ पायथन 2 लैंग्वेज गाइड द्वारा डिस्ट्रक्टर्स कहे जाने वाले तरीके,[4] लेकिन वे वास्तव में फाइनलाइज़र हैं जैसा कि पायथन 3 में स्वीकार किया गया है।[5]
  • जंग (प्रोग्रामिंग भाषा): जंग के लिए डिस्ट्रक्टर विधि का नाम ड्रापहै [6]
  • स्विफ्ट (प्रोग्रामिंग भाषा): डिस्ट्रक्टर मेथड का नामडेनिट है।

सी ++ में

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

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

एक डिस्ट्रक्टर को कभी अपवाद नहीं फेंकना चाहिए।[7]

गैर-श्रेणी के अदिश प्रकारों को a कहा जाता है छद्म डिस्ट्रक्टर जिसका उपयोग करके पहुँचा जा सकता है typedef या टेम्पलेट तर्क यह निर्माण किसी दिए गए प्रकार के लिए डिस्ट्रक्टर उपलब्ध है या नहीं, यह जानने के बिना कोड लिखना संभव बनाता है।

int f() {
    int a = 123;
    using T = int;
    a.~T();
    return a; // undefined behavior
}

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

उदाहरण

#include <cstring>
#include <iostream>

class Foo {
public:
    Foo(): data_(new char[sizeof("Hello, World!")]) {
        std::strcpy(data_, "Hello, World!");
    }

    Foo(const Foo& other) = delete;             // disable copy construction
    Foo& operator=(const Foo& other) = delete;  // disable assignment

    ~Foo(void) { delete[] data_; }

private:
    friend std::ostream& operator<<(std::ostream& os, const Foo& foo) {
        os << foo.data_;
        return os;
    }

    char* data_;
};

int main() {
    Foo foo;
    std::cout << foo << std::endl;
}

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

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

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

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

ज़ोजो

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

Class Foobar
  // Old form
  Sub ~Foobar()
  End Sub

  // New form
  Sub Destructor()
  End Sub
End Class

यह भी देखें

संदर्भ

  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.