दिलचस्प पोस्ट
बूटस्ट्रैप 3 – पंक्ति वर्ग उसके कंटेनर से अधिक व्यापक क्यों है? एचटीएमएल चार्सेट एन्कोडिंग के साथ PHP गड़बड़ मैं TextView का रंग हिस्सा कैसे बदल सकता / सकती हूं? ब्राउज़र से सी # एप्लिकेशन पर URL प्राप्त करें कैसे CSS3 गोल कोने क्रोम / ओपेरा में ओवरफ्लो छिपाएगा `स्रोत '(' myfile.r ') जैसे आर मार्कडाउन फ़ाइल को स्रोत कैसे करें? जावा में int के लिए सुरक्षित रूप से कास्टिंग पायथन: जब मेरी सूची में वास्तव में परिवर्तन नहीं होता है तो मेरी सूची क्यों बदलती है? सी # में 2 आयामी सूची संभव है? स्विफ्ट सी-स्टाइल के लूप के बहिष्कार के बाद एक पाश में घटाना सूचकांक JQuery में अजाक्स-अनुरोधों के साथ फॉर्मडेटा ऑब्जेक्ट कैसे भेजें? डाउनलोड करने के लिए PHP उत्पन्न फ़ाइल तब पुनर्निर्देशित करें एकल चेतावनी त्रुटि को अक्षम करें सी ++ हेक्स स्ट्रिंग कन्वर्ट करने के लिए हस्ताक्षरित पूर्णांक लैटिन 1 एन्कोडेड कॉलम- MySQL में UTF-8 वर्णों का पता कैसे लगाया जाता है

सी ++ में प्लेसमेंट हटाए जाने की अभिव्यक्ति क्यों नहीं है?

क्यों सी ++ प्लेसमेंट हटाए नहीं है जो सीधे प्लेसमेंट नई से मेल खाता है, यानी डिस्ट्रक्टर को कॉल करता है और उचित प्लेसमेंट डिलीट ऑपरेटर को कॉल करता है?

उदाहरण के लिए:

MyType *p = new(arena) MyType; ... //current technique p->~MyType(); operator delete(p, arena); //proposed technique delete(arena) p; 

Solutions Collecting From Web of "सी ++ में प्लेसमेंट हटाए जाने की अभिव्यक्ति क्यों नहीं है?"

operator delete एक गैर-सदस्य या स्थिर सदस्य कार्य होने में अद्वितीय है जो गतिशील रूप से प्रेषित है। वर्चुअल डिस्ट्रक्टर के साथ एक प्रकार सबसे व्युत्पन्न डिस्ट्रक्टर से अपने delete को कॉल करता है।

 struct abc { virtual ~abc() = 0; }; struct d : abc { operator delete() { std::cout << "goodbye\n"; } }; int main() { abc *p = new d; delete p; } 

( इस उदाहरण को चलाएं ।)

इसके लिए प्लेसमेंट डिलीट के साथ काम करने के लिए, डिस्ट्रक्टर को किसी भी तरह operator delete लिए अतिरिक्त तर्क देना होगा।

  • समाधान 1: आभासी फ़ंक्शन के माध्यम से तर्कों को पारित करें। इसके लिए प्रत्येक स्टेटिक सदस्य के लिए एक अलग वर्चुअल डिस्ट्रक्टर की आवश्यकता होती है और विभिन्न ऑब्जेक्ट्स के साथ ग्लोबल operator delete ओवरलोड होता है।
  • समाधान 2: आभासी नाशक को कॉलर को एक फ़ंक्शन पॉइंटर लौटा दें, जो निर्दिष्ट करें कि operator delete को किस प्रकार operator delete देना चाहिए। लेकिन यदि डिस्ट्रक्टर खोज करता है, तो यह 1/2 के रूप में कई वर्चुअल फ़ंक्शन परिभाषाओं की आवश्यकता की एक ही समस्या को हल करता है। किसी तरह का सार अधिभार सेट बनाया जाना चाहिए, जिसे कॉल करनेवाला हल होगा।

आपके पास बिल्कुल अच्छी बात है, और यह भाषा के लिए एक अच्छी जोड़ी होगी। इसे delete के मौजूदा शब्दों में delete करना संभवतः संभवतः सिद्धांत में भी है। लेकिन ज्यादातर समय हम delete की पूर्ण कार्यक्षमता का उपयोग नहीं करते हैं और यह एक छद्म-नाशक कॉल का उपयोग करने के लिए पर्याप्त होता है, जैसे कि arena.release(p)

क्योंकि इसमें कोई ज़रूरत नहीं है, क्योंकि हमारे पास पहले से ही ptr->~type();

संभवत: क्योंकि एक निर्णायक बिना किसी deallocation (बिल्कुल आपके प्रश्न के रूप में) को बुलाए जाने के लिए वाक्यविन्यास था, लेकिन कच्चे मेमोरी में स्पष्ट निर्माण के लिए कोई सिंटैक्स नहीं था?

असल में प्लेसमेंट डिलीट होता है जिसे एक ऑब्जेक्ट के कार्यान्वयन से कहा जाता है जो कि "आवंटित" प्लेसमेंट नई का उपयोग कर रहा था अगर कन्स्ट्रक्टर ने अपवाद छोड़ा

विकिपीडिया से

नियुक्ति हटाने के कार्यों को प्लेसमेंट न्यू एक्सप्रेशन से कहा जाता है। विशेष रूप से, उन्हें कहा जाता है कि यदि ऑब्जेक्ट के निर्माता एक अपवाद फेंकता है ऐसी स्थिति में, यह सुनिश्चित करने के लिए कि प्रोग्राम में मेमोरी रिसाव नहीं होता है, प्लेसमेंट हटाए गए कार्यों को कहा जाता है

नियुक्ति के पूरे बिंदु को अपनी स्मृति प्रबंधन से वस्तु निर्माण को अलग करना है। इसलिए वस्तु विनाश के दौरान इसे वापस टाई करने का कोई मतलब नहीं है।
यदि आपके ऑब्जेक्ट्स के लिए मेमोरी ढेर से है और आप ऑब्जेक्ट्स के लिए एक ही लाइफटाइज चाहते हैं और उनकी मेमोरी सिर्फ operator new और operator delete , अगर आप कोई विशेष व्यवहार चाहते हैं तो उन्हें ओवरराइड कर लें।
नियुक्ति नया सदिश में उदाहरण के लिए अच्छा है, जो कच्ची स्मृति का एक बड़ा हिस्सा रखता है और इसके अंदर वस्तु को नष्ट कर देता है और नष्ट करता है, लेकिन स्मृति को रिहा किए बिना