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

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

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

विध्वंसक सिंटैक्स

 * सी ++: विनाशकों के पास वही नाम होता है जिसके साथ वे जुड़े होते हैं, लेकिन एक टिल्ड (~) उपसर्ग के साथ। * डी (प्रोग्रामिंग भाषा): विनाशकों को नाम से घोषित किया जाता है  (जबकि कंस्ट्रक्टर्स को घोषित किया जाता है  ).
 * वस्तु पास्कल: डिस्ट्रक्टर्स के पास कीवर्ड होता है  और उपयोक्ता परिभाषित नाम हो सकते हैं, लेकिन ज्यादातर नाम हैं.
 * उद्देश्य सी: डिस्ट्रक्टर मेथड का नाम है.
 * पर्ल: विध्वंसक विधि का नाम है ; मूस (पर्ल) में इसका नाम है.
 * PHP: PHP 5+ में, विध्वंसक विधि का नाम है . PHP के पूर्व संस्करणों में कोई विध्वंसक नहीं थे।
 * पायथन (प्रोग्रामिंग भाषा): वहाँ हैं   पायथन 2 लैंग्वेज गाइड द्वारा डिस्ट्रक्टर्स कहे जाने वाले तरीके, लेकिन वे वास्तव में फाइनलाइज़र हैं जैसा कि पायथन 3 में स्वीकार किया गया है।
 * जंग (प्रोग्रामिंग भाषा): जंग के लिए विनाशक विधि का नाम है
 * स्विफ्ट (प्रोग्रामिंग भाषा): डिस्ट्रक्टर मेथड का नाम है.

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

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

एक विनाशक को कभी अपवाद नहीं फेंकना चाहिए। गैर-श्रेणी के अदिश प्रकारों को a कहा जाता है जिसका उपयोग करके पहुँचा जा सकता है   या टेम्पलेट तर्क। यह निर्माण किसी दिए गए प्रकार के लिए विनाशक मौजूद है या नहीं, यह जानने के बिना कोड लिखना संभव बनाता है। <वाक्यविन्यास लैंग = सीपीपी> इंट एफ { इंट ए = 123; टी = इंट का उपयोग करना; ए ~ टी ; वापसी ए; // अपरिभाषित व्यवहार } 

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

उदाहरण
<वाक्यविन्यास लैंग = सीपीपी>
 * 1) शामिल <सीस्ट्रिंग>
 * 2) शामिल

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

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

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

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

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

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

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

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

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

यह भी देखें

 * फाइनलाइज़र
 * निर्माता (कंप्यूटर विज्ञान)
 * वस्तु जीवनकाल
 * संसाधन अधिग्रहण प्रारंभ है
 * तीन का नियम (C++ प्रोग्रामिंग)