2010-11-29 11 views
13

संभव डुप्लिकेट:
Is it OK to use “delete this” to delete the current object?अगर आप सी ++ में इसे हटाना क्या होगा

मैं बस कुछ कोड है, जहां वे एक वर्ग समारोह में delete this; किया है देखा था, मुझे पता है कि यह है एक अच्छा डिजाइन नहीं है, लेकिन यह परिभाषित किया गया है कि क्या होगा, कहें कि कक्षा हमेशा कहीं से एक सूचक है। क्या यह हमेशा सही तरीके से हटा दिया जाएगा?

class A 
{ 
public: 
    void abort() { delete this; } 
}; 

class B 
{ 
    void func() { A* a = new A; a->abort(); } 
}; 
+2

देखें http://stackoverflow.com/questions/447379/what-is-the-use-of-delete-this/447531#447531 – icecrime

+1

लिंक्ड पोस्ट संबंधित हैं, लेकिन डुप्लीकेट नहीं लगते हैं। –

उत्तर

17

यह सी ++ से delete this में पूरी तरह से कानूनी है और वास्तव में स्मार्ट पॉइंटर्स जैसे कुछ पैटर्न के लिए बहुत उपयोगी है। बोझ डेवलपर पर है हालांकि यह सुनिश्चित करने के लिए कि this के लिए स्टैक पर कोई अन्य विधि या कॉल नहीं किया गया है जो हटाए जाने के बाद इंस्टेंस डेटा तक पहुंच जाएगा।

सी ++ पूछे जाने वाले प्रश्न Lite इस के लिए एक प्रवेश

+3

सी ++ में बहुत सी चीजें हैं जो पूरी तरह कानूनी हैं फिर भी एक बुरा विचार है। –

0

के रूप में यह एक टिप्पणीकार द्वारा बताया गया कोई अपरिभाषित व्यवहार है, अगर कोई अन्य सदस्यों के बाद उसे हटा यदि आप वस्तु के अन्य सदस्यों का उपयोग नहीं करते आप कार्य करने के लिए जारी रखने के लिए सक्षम हो जाएगा कहा जाता है।

+2

जब तक 'हटाएं' कथन के बाद कोई सदस्य चर का उपयोग नहीं किया जाता है, तो व्यवहार अच्छी तरह से परिभाषित किया जाता है। – MartinStettner

1

हाँ पढ़ने लायक है जो है। आपको केवल देखभाल करना है,कथन के बाद पॉइंटर delete के बाद मान्य नहीं होगा, क्योंकि कोई उदाहरण चर नहीं है (और कोई वर्चुअल विधि, मुझे लगता है) delete कथन के बाद उपयोग नहीं किया जाता है।

+0

यह एकमात्र चीज नहीं है जिसके बारे में आपको ध्यान रखना है। –

1

हाँ, इसे सामान्य रूप से हटाया जाना चाहिए।

कुछ उपयोगी अवसर हैं जब यह उपयोगी होता है, लेकिन यह सुनिश्चित करने के लिए अतिरिक्त देखभाल की आवश्यकता होती है कि ऑब्जेक्ट को उसके बाद कभी भी एक्सेस न किया जाए।

0

इस विशेष मामले यह ठीक है में, लेकिन लगता है कि क्या हुआ अगर a स्वत: चर रहा है क्या होगा:

void foo() { 
    A a; 
    a.abort(); // BOOM! 
} 
+0

जब आप ऐसा करते हैं तो वास्तव में * क्या होता है? – Cameron

+0

मुझे विश्वास है कि भाषा में सटीक व्यवहार परिभाषित नहीं किया गया है, यानी यह यूबी है। अधिकांशतः आवंटक परत उस पते पर जोर देगी जो इसकी वैध सीमा में नहीं है। इसे आज़माएं :) –

+0

आप वास्तव में एक संरक्षित विनाशक बनाकर इसे रोक सकते हैं। फिर आप अपनी abort() विधि को कॉल करने के अलावा किसी अन्य को पॉइंटर नहीं हटा सकते हैं और आप स्टैक पर एक नहीं बना सकते हैं। – CashCow

2

यह मामला है कि delete this; बुरा डिजाइन है नहीं है, और यह निश्चित रूप से अपरिभाषित व्यवहार में परिणाम नहीं करता है। यह वही करता है जो आप उम्मीद करेंगे - यह इस वस्तु को हटा देता है। इसका मतलब है कि आप वास्तव में यह सुनिश्चित कर चुके थे कि delete this के बाद आप ऑब्जेक्ट के साथ कुछ और नहीं करते हैं।

माइक्रोसॉफ्ट एमएफसी कक्षाएं उदाहरण के लिए delete this; का उपयोग करती हैं, उदाहरण के लिए सीडब्ल्यूएनडी (विंडो) कक्षा में। जब एक विंडो WM_DESTROY संदेश प्राप्त करती है, तो विंडो रैपर क्लास (जो सी ++ ऑब्जेक्ट है) की आवश्यकता नहीं है, इसलिए यह delete this; पर कॉल करता है (मुझे लगता है कि PostNcDestroy() में कहीं ऐसा है)। ढांचे के उपयोगकर्ता के दृष्टिकोण से यह बहुत साफ है: आपको बस याद रखना होगा कि C++ ऑब्जेक्ट को स्वचालित रूप से हटाए जाने के तरीके हैं और विंडो के जीवनकाल के अंत में थोड़ा सावधान रहें।

मुझे यकीन है कि कई अन्य वास्तविक दुनिया के उदाहरण हैं जहां delete this; एक उपयोगी प्रतिमान है।

संबंधित मुद्दे