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

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

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

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

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

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

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

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

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

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

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

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

यह भी देखें

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