पर इसके विपरीत, आप हमेशा हद तक ढेर चाहिए पसंद करते आवंटन, कि एक सामान्य नियम के रूप में, आप नए कभी नहीं होना चाहिए/अपने उपयोगकर्ता कोड में हटा दें।
आप कहते हैं के रूप में, जब चर ढेर पर घोषित किया जाता है, इसके नाशक स्वचालित रूप से कहा जाता है, जब यह गुंजाइश है, जो ट्रैकिंग संसाधन जीवन और परहेज लीक के लिए अपने मुख्य उपकरण है से बाहर चला जाता है है।
तो सामान्य रूप से, हर बार जब आपको संसाधन आवंटित करने की आवश्यकता होती है, चाहे वह स्मृति (नया कॉल करके), फ़ाइल हैंडल, सॉकेट या कुछ और, इसे उस वर्ग में लपेटें जहां कन्स्ट्रक्टर संसाधन प्राप्त करता है, और विनाशक रिलीज यह। फिर आप उस प्रकार का ऑब्जेक्ट स्टैक पर बना सकते हैं, और आपको गारंटी है कि जब आपका दायरा समाप्त हो जाता है तो आपका संसाधन मुक्त हो जाता है। इस तरह से आप मेमोरी लीक से बचने के लिए हर जगह अपने नए/हटाए गए जोड़े को ट्रैक करने की ज़रूरत नहीं है।
इस मुहावरे के लिए सबसे आम नाम RAII
इसके अलावा स्मार्ट सूचक वर्ग है जो जब आप एक समर्पित आरए II वस्तु के बाहर नए के साथ कुछ आवंटित करने के लिए क्या है दुर्लभ मामलों पर जिसके परिणामस्वरूप संकेत रैप करने के लिए उपयोग किया जाता है पर गौर है। इसके बजाय आप पॉइंटर को एक स्मार्ट पॉइंटर पर पास करते हैं, जो उसके जीवनकाल को ट्रैक करता है, उदाहरण के लिए संदर्भ गिनती के द्वारा, और आखिरी संदर्भ दायरे से बाहर होने पर विनाशक को बुलाता है।मानक पुस्तकालय में std::unique_ptr
सरल स्कोप-आधारित प्रबंधन के लिए है, और std::shared_ptr
जो साझा स्वामित्व को लागू करने के लिए संदर्भ गणना करता है।
कई ट्यूटोरियल जैसे ...
तो क्या आपको पता चला है कि ज्यादातर ट्यूटोरियल चूसना है एक टुकड़ा का उपयोग कर वस्तु इन्स्टेन्शियशन का प्रदर्शन। ;) अधिकतर ट्यूटोरियल आपको लुसी सी ++ प्रथाओं को सिखाते हैं, जिसमें आवश्यकतानुसार चर बनाने के लिए नए/डिलीट को कॉल करना शामिल है, और आपको अपने आवंटन के जीवनकाल को ट्रैक करने में कठिनाई होती है।
कच्चे पॉइंटर्स उपयोगी होते हैं जब आप auto_ptr-like semantics (स्वामित्व स्थानांतरित करना) चाहते हैं, लेकिन गैर-फेंकने वाले स्वैप ऑपरेशन को बनाए रखें, और संदर्भ गणना के ओवरहेड को नहीं चाहते हैं। एज मामला शायद, लेकिन उपयोगी है। –
यह एक सही उत्तर है, लेकिन कारण मैं कभी भी ढेर पर वस्तुओं को बनाने की आदत में नहीं पहुंचूंगा क्योंकि यह कभी भी स्पष्ट नहीं है कि वह वस्तु कितनी बड़ी होगी। आप बस एक स्टैक-ओवरफ्लो अपवाद मांग रहे हैं। – dviljoen
ग्रेग: निश्चित रूप से। लेकिन जैसा कि आप कहते हैं, एक बढ़त मामला। आम तौर पर, पॉइंटर्स से बचा जाता है। लेकिन वे एक कारण के लिए भाषा में हैं, कोई इनकार नहीं करते हैं। :) dviljoen: यदि ऑब्जेक्ट बड़ा है, तो आप इसे एक RAII ऑब्जेक्ट में लपेटते हैं, जिसे स्टैक पर आवंटित किया जा सकता है, और इसमें हेप-आवंटित डेटा के लिए एक पॉइंटर होता है। – jalf