delete this
एक विनाशक में मान्य नहीं है। इसका इस्तेमाल कहीं और किया जा सकता है। लेकिन यह शायद ही कभी एक अच्छा विचार है। wxWidgets
ढांचा इसे अपने धागे वर्ग के लिए उपयोग करता है। इसमें एक मोड है, जहां थ्रेड निष्पादन समाप्त होता है, यह स्वचालित रूप से सिस्टम संसाधनों और स्वयं (wxThread ऑब्जेक्ट) को मुक्त करता है। मैंने इसे बहुत परेशान पाया, क्योंकि बाहर से, आप नहीं जानते कि यह संदर्भित करने के लिए मान्य है या नहीं - आप IsValid
जैसे फ़ंक्शन को कॉल नहीं कर सकते हैं, क्योंकि ऑब्जेक्ट मौजूद नहीं है। यह delete this
के साथ मुख्य समस्या की तरह गंध करता है, समस्या के अलावा कि इसका उपयोग गैर गतिशील वस्तुओं के लिए नहीं किया जा सकता है।
यदि आप ऐसा करते हैं, तो सुनिश्चित करें कि आप किसी भी डेटा-सदस्य को स्पर्श न करें, या किसी भी सदस्य फ़ंक्शन को उस ऑब्जेक्ट पर कॉल करें जिसे आपने हटा दिया था। गैर-वर्चुअल, संरक्षित या निजी फ़ंक्शन में अंतिम विवरण के रूप में इसे सर्वश्रेष्ठ बनाएं। कॉलिंग डिलीट वर्चुअल और/या पब्लिक फ़ंक्शन में मान्य है, लेकिन मैं इसे करने की विधि की दृश्यता को प्रतिबंधित कर दूंगा।
C++ FAQ इसके बारे में एक प्रविष्टि है। ऊपर मेरे दावे पर सी ++ स्टैंडर्ड बोली (3.8p5
):
एक वस्तु के जीवनकाल से पहले शुरू कर दिया है लेकिन भंडारण जो वस्तु पर कब्जा आवंटित होगा किया गया है या, के बाद एक वस्तु का जीवन समाप्त हो गया है और इससे पहले कि के बाद भंडारण जिस पर कब्जा किया गया ऑब्जेक्ट पुन: उपयोग या जारी किया जाता है, कोई भी सूचक जो भंडारण स्थान को संदर्भित करता है जहां ऑब्जेक्ट होगा या स्थित था, लेकिन केवल सीमित तरीकों से उपयोग किया जा सकता है। [...] यदि ऑब्जेक्ट एक गैर-तुच्छ विनाशक के साथ कक्षा प्रकार का होगा या पॉइंटर का उपयोग हटाए जाने वाले अभिव्यक्ति के संचालन के रूप में किया जाता है, तो प्रोग्राम ने व्यवहार को अपरिभाषित किया है।
लाइफटाइम समाप्त होता है जब वस्तु का विनाश निष्पादन शुरू होता है। ध्यान दें कि निर्माण और विनाश के तहत वस्तुओं के लिए उस पैराग्राफ के बाद आने वाले नियमों के अपवाद हैं (उदाहरण के लिए आपको गैर स्थैतिक डेटा सदस्यों तक पहुंचने की अनुमति है), 12.7
पर विस्तृत।
स्रोत
2009-01-15 16:44:55
जबकि refcounted वस्तुओं का आत्म-विलोपन एक बहुत ही आम पैटर्न है, मुझे लगता है कि मूल प्रश्न इसे एक विनाशक में डालने के बारे में था, रिलीज() फ़ंक्शन नहीं, जिस स्थिति में यह केवल पागल है। – rmeador
@ रेमेडोर, वास्तव में दो प्रश्न हैं। शीर्षक और अंतिम वाक्य दोनों सुझाव देते हैं कि "इसे हटाएं" के वैध उपयोगों को जानना चाहते हैं। मुझे उम्मीद है कि मैंने इसका उत्तर दिया। मध्य एक प्रश्न का सुझाव देता है "इसे एक डॉटर में क्यों हटाएं"। मैं ऐसा करने के लिए सहमत हूं कि पागल हो रहा है। – JaredPar
आपके नमूना कोड में एक बग है। यदि _refCount सदस्य चर है, तो जब आप "इसे हटा दें" तो सदस्य चर अब मौजूद नहीं है, इसलिए आपकी "वापसी _refCount" पंक्ति में व्यवहार को अपरिभाषित किया गया है। – ChrisN