ऐसा लगता है कि हम इस मामले में स्पष्ट रूप से विनाशक को बुला सकते हैं, क्या आप मुझे समझा सकते हैं क्यों?
क्योंकि जब भी आप चाहें तो किसी भी वस्तु के विनाशक को आमंत्रित करने में सक्षम होने के लिए भाषा की अनुमति है (मान लीजिए कि आपके पास पहुंच है, उदाहरण के लिए यह एक निजी विनाशक नहीं है)।
क्या उन नाशक कॉल इस उदाहरण में क्या मतलब है?
यह सिर्फ विनाशक को आमंत्रित करता है। तर्कसंगत रूप से, इसका मतलब है कि वस्तु को नष्ट कर दिया गया है और उस बिंदु से कचरा माना जाना चाहिए और इसे संदर्भित या उपयोग नहीं किया जाना चाहिए। तकनीकी रूप से इसका मतलब यह है कि वस्तु किसी भी राज्य में है जो विनाशक इसे छोड़ देता है, जो कुछ वस्तुओं के लिए डिफ़ॉल्ट निर्माण के समान हो सकता है (लेकिन आपको कभी भी उस पर भरोसा नहीं करना चाहिए)।
वे उचित क्यों हैं?
कभी-कभी आपको अपनी याददाश्त जारी किए बिना वस्तुओं को नष्ट करने की आवश्यकता होती है। इस प्रकार/किसी भी, विभिन्न स्क्रिप्ट बंधन और प्रतिबिंब प्रणाली, कुछ सिंगलटन कार्यान्वयन की तरह कक्षा का एक बहुत में होता है, आदि
उदाहरण के लिए, आप std::aligned_storage
उपयोग कर सकते हैं एक वस्तु के लिए एक बफर आवंटित करने के लिए और उसके बाद नियुक्ति नए का उपयोग निर्माण करने के लिए के लिए उस बफर में एक वस्तु। आप इस ऑब्जेक्ट पर delete
पर कॉल नहीं कर सकते हैं क्योंकि इससे दोनों विनाशक का आह्वान करेंगे और स्मृति का समर्थन करने की कोशिश करेंगे। आप स्पष्ट रूप से इस मामले में विनाशक को ऑब्जेक्ट को सही तरीके से नष्ट करने के लिए आमंत्रित करते हैं।
मामलों है कि हम स्पष्ट रूप से नियुक्ति के अलावा हटाना विनाशकर्ता कॉल कर सकते हैं क्या हैं?
वहाँ वास्तव में इस तरह के एक नया स्थान (और delete
के लिए किसी भी कॉल करने के लिए इसी ऑपरेटर के अलावा अन्य 'को हटाना प्लेसमेंट' के रूप में बात, परोक्ष उन संकलक में विफल रहा है निर्माण के लिए आह्वान को छोड़कर नाशक लागू करेगा नहीं है, उदाहरण के लिए अपने 'प्लेसमेंट को हटा 'धारणा)।
एक उदाहरण मैंने ऊपर दिया। एक और उदाहरण std::vector
है। आप सदस्य कार्यों को pop_back()
पर कॉल कर सकते हैं। इसे वेक्टर में अंतिम तत्व को नष्ट करने की आवश्यकता है लेकिन यह delete
का उपयोग नहीं कर सकता है क्योंकि ऑब्जेक्ट का समर्थन करने वाली मेमोरी एक बड़े बफर का हिस्सा है जिसे अलग से प्रबंधित किया जाना चाहिए। यह कई अन्य कंटेनरों के लिए भी जाता है, जैसे ओपन-एड्रेसिंग हैश टेबल, deque
, और इसी तरह। विनाशक को स्पष्ट रूप से आमंत्रित करने के लिए यह एक उदाहरण है जहां आप template typename
का उपयोग करना चाहते हैं।
यह एक विशेषता है कि पुस्तकालय के उपयोगकर्ता को शायद ही कभी आवश्यकता होती है लेकिन एसटीएल या यहां तक कि कुछ एप्लिकेशन ढांचे जैसे निम्न स्तर की लाइब्रेरी के कार्यान्वयन को यहां और वहां उपयोग करने की आवश्यकता होगी।
संदर्भित पोस्ट एक स्थानीय चर पर स्पष्ट रूप से एक विनाशक को बुलाए जाने के बारे में है, जिसका विनाशक इसके दायरे के अंत में फिर से बुलाया जाता है। –
+1 मैंने अपने कोड में कुछ समान बकवास किया है, जिससे विनाशक को मेरी वस्तु को नष्ट करने के लिए स्पष्ट रूप से बुलाया गया है (या यह काम करने लगता है)। लेकिन मैंने इसे प्रबंधित प्रकारों पर किया है। जवाब देखने के लिए दिलचस्प होगा –
@ एंडी थॉमस-क्रैमर मैं समझता हूं, मेरा मतलब क्या है जो उत्तर से स्पष्टीकरण है जो स्पष्ट विनाशक कॉल के बारे में मानक उद्धृत करता है। क्या मेरी पोस्ट भ्रामक है? अगर यह एक समस्या है तो मैं इसे पुन: पेश करने की कोशिश करूंगा। – taocp