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