मैं सी ++ में आरएआईआई मुहावरे के बारे में सीख रहा हूं, और स्मार्ट पॉइंटर्स का उपयोग कैसे करें।जब कोई कन्स्ट्रक्टर अपवाद फेंकता है तो आरएआईआई कैसे काम करता है?
मेरी पढ़ाई में, मैं दो चीजों में आया हूं, मेरे लिए, एक-दूसरे से विरोधाभास प्रतीत होता है।
http://www.hackcraft.net/raii/ से उद्धरित:
... आरए II अर्थ विज्ञान के साथ एक सदस्य वस्तु बना दिया गया है, तो और निर्माता तो इसकी नाशक स्टैक के भाग के रूप बुलाया जाएगा पूरा कर लिया है पहले एक अपवाद होता है। इसलिए एक ऑब्जेक्ट जो एकाधिक संसाधनों को नियंत्रित करता है, वे अपने सफाई को गिनती कर सकते हैं भले ही यह सदस्य RAII ऑब्जेक्ट्स का उपयोग करके पूरी तरह से निर्मित नहीं किया गया हो।
लेकिन उद्धृत http://www.parashift.com/c++-faq-lite/exceptions.html#faq-17.10 से: एक निर्माता एक अपवाद फेंकता है तो
, वस्तु नाशक नहीं चला है। यदि आपकी ऑब्जेक्ट पहले से ही कुछ कर चुकी है जिसे पूर्ववत करने की आवश्यकता है (जैसे कुछ मेमोरी आवंटित करना, फ़ाइल खोलना, या सेमफोर लॉक करना), तो "सामान जो पूर्ववत करने की आवश्यकता है" को ऑब्जेक्ट के अंदर डेटा सदस्य द्वारा याद किया जाना चाहिए।
और फिर दूसरा लिंक स्रोत स्मार्ट पॉइंटर्स का उपयोग उन चीजों के मुद्दे से निपटने के लिए करता है जो पहले से ही कन्स्ट्रक्टर में आवंटित किए गए थे।
तो इन परिदृश्यों में वास्तव में क्या होता है?
+1 यह तरीका है कि "newprogrammer [s]" * प्रश्न पूछना चाहिए! –