डिस्ट्रक्टर (कंप्यूटर प्रोग्रामिंग)
वस्तु-उन्मुख प्रोग्रामिंग में, एक डिस्ट्रक्टर (कभी-कभी संक्षिप्त रूप में डीटोर[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 के साथ बनाया गया था
कथन (गतिशील रूप से मेमोरी प्रबंधन #HEAP पर), तो इसके डिस्ट्रक्टर को तब कहा जाता है जब new
ऑपरेटर को ऑब्जेक्ट के पॉइंटर पर लागू किया जाता है। सामान्यतः यह ऑपरेशन किसी अन्य विनाशक के भीतर होता है, सामान्यतः स्मार्ट सूचक ऑब्जेक्ट का विनाशक।
delete
वंशानुक्रम पदानुक्रम में, वर्चुअल फ़ंक्शन # बेस क्लास में वर्चुअल डिस्ट्रक्टर्स की घोषणा यह सुनिश्चित करती है कि पॉइंटर-टू-बेस-क्लास के माध्यम से किसी ऑब्जेक्ट को हटाए जाने पर व्युत्पन्न कक्षाओं के विनाशकों को ठीक से लागू किया जाता है। जिन वस्तुओं को इस प्रकार से हटाया जा सकता है, उन्हें एक आभासी डिस्ट्रक्टर को इनहेरिट करने की आवश्यकता है।
एक विनाशक को कभी अपवाद नहीं फेंकना चाहिए।[7]
गैर-श्रेणी के अदिश प्रकारों को a कहा जाता है pseudo-destructor जिसका उपयोग करके पहुँचा जा सकता है typedef
या टेम्पलेट तर्क। यह निर्माण किसी दिए गए प्रकार के लिए विनाशक उपलब्ध है या नहीं, यह जानने के बिना कोड लिखना संभव बनाता है।
<वाक्यविन्यास लैंग = सीपीपी>
इंट एफ () {
इंट ए = 123; टी = इंट का उपयोग करना; ए ~ टी (); वापसी ए; // अपरिभाषित व्यवहार
} </वाक्यविन्यास हाइलाइट>
मानक के प्राचीन संस्करणों में, छद्म-विनाशकों को कोई प्रभाव नहीं होने के लिए निर्दिष्ट किया गया था, चूंकि उन्हें उस वस्तु के जीवनकाल को समाप्त करने के लिए एक दोष रिपोर्ट में बदल दिया गया था जिस पर उन्हें बुलाया गया था।[8]
उदाहरण
<वाक्यविन्यास लैंग = सीपीपी>
- सम्मलित <सीस्ट्रिंग>
- सम्मलित <iostream>
कक्षा फू { जनता:
फू (): डेटा_ (नवीनतम चार [बनावट (हैलो, वर्ल्ड!)]) { एसटीडी�:: strcpy (डेटा_, हैलो, वर्ल्ड!); }
फू (स्थिरांक फू और अन्य) = हटाएं; // कॉपी निर्माण अक्षम करें फू और ऑपरेटर = (स्थिर फू और अन्य) = हटाएं; // असाइनमेंट अक्षम करें
~ फू (शून्य) {हटाएं [] डेटा_; }
निजी:
मित्र एसटीडी :: ओस्ट्रीम और ऑपरेटर << (एसटीडी :: ओस्ट्रीम और ओएस, कास्ट फू और फू) { ओएस << foo.data_; वापसी ओएस; }
चार * डेटा_;
};
मुख्य प्रवेश बिंदु() {
फू फू; एसटीडी�:: अदालत << फू << एसटीडी�:: एंडएल;
} </वाक्यविन्यास हाइलाइट> जिन वस्तुओं को सुरक्षित रूप से कॉपी और / या असाइन नहीं किया जा सकता है, उन्हें सार्वजनिक इनकैप्सुलेशन स्तर के भीतर हटाए गए उनके संबंधित कार्यों को घोषित करके इस प्रकार के शब्दार्थ से अक्षम किया जाना चाहिए। इस पद्धति का विस्तृत विवरण स्कॉट मेयर्स की लोकप्रिय पुस्तक, प्रभावी आधुनिक सी ++ (आइटम 11: निजी अपरिभाषित लोगों को हटाए गए कार्यों को प्राथमिकता दें) में पाया जा सकता है।[9]).
जीसीसी एक्सटेंशन के साथ सी में
जीएनयू संकलक संग्रह का C (प्रोग्रामिंग लैंग्वेज) कंपाइलर 2 एक्सटेंशन के साथ आता है जो डिस्ट्रक्टर्स को लागू करने की अनुमति देता है:
destructor
ई> फ़ंक्शन विशेषता[10] वैश्विक प्राथमिकता वाले डिस्ट्रक्टर कार्यों को परिभाषित करने की अनुमति देता है: कबmain()
रिटर्न, प्रक्रिया समाप्त होने से पहले इन कार्यों को प्राथमिकता क्रम में कहा जाता है। यह भी देखें: शोषण की कला को हैक करना।[11]- संसाधन अधिग्रहण आरंभीकरण है # Clang और C के लिए GCC क्लीनअप एक्सटेंशन एक डिस्ट्रक्टर फ़ंक्शन को एक चर के साथ संलग्न करने की अनुमति देता है: फ़ंक्शन को तब कहा जाता है जब चर दायरे से बाहर हो जाता है।
ज़ोजो
Xojo (REALbasic) में विनाशक दो रूपों में से एक में हो सकते हैं। प्रत्येक प्रपत्र एक विशेष नाम के साथ एक नियमित विधि घोषणा का उपयोग करता है (कोई पैरामीटर नहीं और कोई वापसी मान नहीं)। पुराना रूप ~ (टिल्डे) उपसर्ग के साथ कक्षा के समान नाम का उपयोग करता है। नवीनतम रूप नाम का उपयोग करता है Destructor
. नए फॉर्म को प्राथमिकता दी जाती है क्योंकि यह कोड कोड रीफैक्टरिंग क्लास को आसान बनाता है।
वर्ग फूबर // पुराना रूप उप ~ फूबार () अंत उप // नए रूप मे उप डिस्ट्रक्टर () अंत उप अंत वर्ग
यह भी देखें
- फाइनलाइज़र
- निर्माता (कंप्यूटर विज्ञान)
- वस्तु जीवनकाल
- संसाधन अधिग्रहण प्रारंभ है
- तीन का नियम (C++ प्रोग्रामिंग)
संदर्भ
- ↑ "झाड़ी". TheFreeDictionary.com. Retrieved 2018-10-14.
- ↑ 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.
- ↑ Constructors and Destructors, from PHP online documentation
- ↑ "3. Data model — Python 2.7.18 documentation".
- ↑ "3. Data model — Python 3.10.4 documentation".
- ↑ "Destructors - the Rust Reference".
- ↑ GotW #47: Uncaught exceptions Accessed 31 July 2011.
- ↑ Smith, Richard; Voutilainen, Ville. "P0593R6:Implicit creation of objects for low-level object manipulation". open-std.org. Retrieved 2022-11-25.
- ↑ Scott Meyers: Effective Modern C++, O'REILLY, ISBN 9781491903995
- ↑ C "destructor" function attribute
- ↑ Erickson, Jon (2008). Hacking the art of exploitation. No Starch Press. ISBN 978-1-59327-144-2.