डिस्ट्रक्टर (कंप्यूटर प्रोग्रामिंग)
ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग में, एक डिस्ट्रक्टर (कभी-कभी संक्षिप्त रूप में डीटोर[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
यह भी देखें
- फाइनलाइज़र
- निर्माता (कंप्यूटर विज्ञान)
- ऑब्जेक्ट जीवनकाल
- संसाधन अधिग्रहण प्रारंभ है
- तीन का नियम (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.