क्या हो रहा है
जब आप लिखते हैं कि T t;
आप स्वचालित संग्रहण अवधि केT
साथ एक प्रकार की वस्तु बना रहे हैं । दायरे से बाहर जाने पर यह अपने आप साफ हो जाएगा।
जब आप लिखते हैं कि new T()
आप गतिशील भंडारण अवधि केT
साथ प्रकार की एक वस्तु बना रहे हैं । यह स्वचालित रूप से साफ नहीं होगा।
इसे delete
साफ करने के लिए आपको इसे एक पॉइंटर पास करना होगा:
हालाँकि, आपका दूसरा उदाहरण बदतर है: आप पॉइंटर को डीफ़र कर रहे हैं, और ऑब्जेक्ट की कॉपी बना रहे हैं। इस तरह से आप पॉइंटर के साथ बनाई गई ऑब्जेक्ट को खो देते हैं new
, इसलिए आप कभी भी इसे हटा नहीं सकते हैं, भले ही आप चाहते हों!
तुम्हे क्या करना चाहिए
आपको स्वचालित भंडारण अवधि पसंद करनी चाहिए। एक नई वस्तु चाहिए, बस लिखें:
A a; // a new object of type A
B b; // a new object of type B
यदि आपको डायनेमिक स्टोरेज अवधि की आवश्यकता है, तो पॉइंटर को एक स्वचालित स्टोरेज अवधि ऑब्जेक्ट में आवंटित ऑब्जेक्ट में स्टोर करें जो इसे स्वचालित रूप से हटा देता है।
template <typename T>
class automatic_pointer {
public:
automatic_pointer(T* pointer) : pointer(pointer) {}
// destructor: gets called upon cleanup
// in this case, we want to use delete
~automatic_pointer() { delete pointer; }
// emulate pointers!
// with this we can write *p
T& operator*() const { return *pointer; }
// and with this we can write p->f()
T* operator->() const { return pointer; }
private:
T* pointer;
// for this example, I'll just forbid copies
// a smarter class could deal with this some other way
automatic_pointer(automatic_pointer const&);
automatic_pointer& operator=(automatic_pointer const&);
};
automatic_pointer<A> a(new A()); // acts like a pointer, but deletes automatically
automatic_pointer<B> b(new B()); // acts like a pointer, but deletes automatically
यह एक सामान्य मुहावरा है जो बहुत-वर्णनात्मक नाम RAII ( संसाधन अधिग्रहण इज इनिशियलाइज़ेशन ) द्वारा जाता है। जब आप एक ऐसे संसाधन का अधिग्रहण करते हैं, जिसे आपको सफाई की आवश्यकता होती है, तो आप इसे स्वचालित भंडारण अवधि की वस्तु में चिपका देते हैं, इसलिए आपको इसे साफ करने के बारे में चिंता करने की आवश्यकता नहीं है। यह किसी भी संसाधन पर लागू होता है, यह मेमोरी, खुली फाइलें, नेटवर्क कनेक्शन, या जो भी आप कल्पना करते हैं।
यह automatic_pointer
बात पहले से ही विभिन्न रूपों में मौजूद है, मैंने इसे केवल एक उदाहरण देने के लिए प्रदान किया है। मानक पुस्तकालय में एक बहुत ही समान वर्ग मौजूद है जिसे कहा जाता है std::unique_ptr
।
नाम का एक पुराना (प्री-सी ++ 11) भी है, auto_ptr
लेकिन अब इसे हटा दिया गया है क्योंकि इसमें एक अजीब नकल व्यवहार है।
और फिर कुछ और भी होशियार उदाहरण हैं, जैसे std::shared_ptr
, कई पॉइंटर्स को एक ही ऑब्जेक्ट के लिए अनुमति देता है और केवल तब ही इसे साफ करता है जब अंतिम पॉइंटर नष्ट हो जाता है।