में पॉइंटर्स क्यों स्कॉप्ड पॉइंटर का उद्देश्य है? मेरी समझ के लिए, स्कॉप्ड पॉइंटर कोड के ब्लॉक के भीतर स्मृति का प्रबंधन करता है। अगर मैं एक ब्लॉक के भीतर एक चर घोषित करना चाहता हूं, तो मैं इसे केवल ढेर पर घोषित कर सकता हूं और सफाई के बारे में चिंता नहीं कर सकता।बूस्ट
बूस्ट
उत्तर
बिंदु यह है कि आप एक निश्चित शब्दावली के भीतर एक सूचक बना और साफ कर सकते हैं। यह विभिन्न स्थितियों में उपयोगी हो सकता है, और यह सुनिश्चित करता है कि delete
को भूलकर, यदि आप new
स्पष्ट रूप से उपयोग करने के लिए अनुशंसित नहीं हैं, तो आपको कोई मेमोरी लीक नहीं है।
आप ध्यान में रखना चाहिए कि boost::scoped_ptr
गैर copyable है, और इसलिए यह पूरी तरह से संसाधन है, के लिए यह की पूरी अवधि के जीवन है का मालिक है। यह boost::shared_ptr
को सुरक्षित बनाता है, क्योंकि यह संसाधन की प्रतिलिपि या गलती से इसे साझा करने से बचाता है।
{ //Some Scope
boost::scoped_ptr<int> i_ptr;
// do something with pointer
} // leave scope, pointer is cleaned up
नहीं अगर यह गतिशील आकार या प्रकार का है। इसके अलावा, स्कोप्ड पॉइंटर्स को स्वैप किया जा सकता है, और सी ++ 11 unique_ptr
में स्थानांतरित किया जा सकता है, इसलिए वे कड़ाई से स्कॉप्ड नहीं हैं।
है कि "प्राथमिक कारण सिवाय 'auto_ptr' की बजाय' scoped_ptr' का उपयोग अपने कोड के पाठकों को यह बताने के लिए है कि आप "संसाधन अधिग्रहण प्रारंभिकरण" का इरादा केवल मौजूदा दायरे के लिए लागू किया जाना है, और स्वामित्व को स्थानांतरित करने का कोई इरादा नहीं है "... जैसा लगता है 'स्वैप 'एक इच्छित उपयोग नहीं है। –
@BenVoigt: लेकिन यह प्रदान किया जाता है और इसका उपयोग किया जा सकता है। – Puppy
यहां [एक पुराना धागा] है (http://lists.boost.org/Archives/boost/2002/09/36359.php) चर्चा करना क्यों 'स्वैप' एक आवश्यकता बन गई (मूल रूप से 'scoped_ptr' को सदस्य के रूप में उपयोग किया जा सकता है एक प्रतिलिपि वर्ग के)। –
आमतौर पर थ्रेड स्टैक्स में मेमोरी सीमा होती है (थ्रेड स्टैक्सइज़ देखें)।
कभी-कभी सूचक आपको बाहर से पास कर दिया गया हो सकता है और इस दायरे में हटा दिया जाना चाहिए (उदाहरण के लिए यदि कोई अपवाद फेंक दिया गया है, तो उस पंक्ति के नीचे कोई भी डिलीट कॉल निष्पादित नहीं होगा)। तो अगर आप की किसी न किसी प्रकार की जरूरत है ऑटो जादुई सूचक
void foo(Object*obj)
{
//this will ensure that object gets cleaned up even if doFoo() throws an exception
boost::scoped_ptr<Object> objCleaner(obj);
obj->doFoo();
}
मैं स्टैक पर पॉइंटर घोषित कर सकता हूं और जब फ़ंक्शन स्कोप से बाहर हो जाता है, तो सफलतापूर्वक या अपवाद के माध्यम से इसे स्वचालित रूप से साफ़ कर दिया जाएगा। सही बात? – Jimm
{एक्स * एक्स = और कुछ ओबीजे; } इससे पॉइंटर एक्स को दायरे से बाहर होने पर हटाया नहीं जाएगा। जब यह दायरे से बाहर हो जाता है तो कुछ ओबीजे हटा दिए जाएंगे। {एक्स * वाई = नया एक्स();} इस प्रकार के कोड को ऑटो क्लीन अप – mohaps
सफाई ढेर आधारित डेटा के विपरीत, scoped_ptr एक रीसेट() सदस्य है - दूसरे शब्दों में, आप/विनाश अपने दिल की सामग्री के लिए निर्माण कर सकते हैं। इसके साथ, आप एक नल पॉइंटर (तकनीकी रूप से operator unspecified-bool-type
) का उपयोग ध्वज के रूप में कर सकते हैं यह दर्शाता है कि किसी भी समय किसी निर्मित वस्तु का निर्माण किया गया है या नहीं। यदि आपको आवश्यकता हो तो यह परिवर्तनीय दायरे से स्वतंत्र रूप से निर्माण/विनाश को अनुक्रमित करने की अनुमति देता है।
इसके अलावा, मान लें कि आप एक वर्ग सदस्य के रूप में एक स्कोप्ड_प्टर घोषित कर सकते हैं, न केवल एक स्टैक वैरिएबल के रूप में। docs हैंडल/बॉडी मुहावरे को लागू करने के लिए scoped_ptr का उपयोग करने का सुझाव देता है (वर्ग 'कार्यान्वयन विवरण छुपाने के लिए)।
अंत में, DeadMG के मुद्दे पर विस्तृत करने के "न ही वह डायनामिक प्रकार का है", तो आप एक polymorphic आपरेशन लागू करने के लिए scoped_ptr उपयोग कर सकते हैं:
{
scoped_ptr<Base> a(mode ? new DerivedA : new DerivedB);
a->polymorphic_function();
}
यह वास्तव में साथ सरल stack- यह करने के लिए संभव है आधारित आवंटन।
इसके अलावा यहाँ देखें: C++0x unique_ptr replaces scoped_ptr taking ownership?
- 1. बूस्ट
- 2. बूस्ट
- 3. बूस्ट
- 4. बूस्ट
- 5. बूस्ट
- 6. बूस्ट
- 7. बूस्ट
- 8. बूस्ट
- 9. बूस्ट
- 10. बूस्ट :: पायथन और बूस्ट :: थ्रेड
- 11. व्यक्तिगत बूस्ट पुस्तकालयों के साथ संकलन, बूस्ट
- 12. बूस्ट :: विभिन्न बूस्ट संस्करणों के साथ TIME_UTC (_)
- 13. बूस्ट :: regex_search
- 14. बूस्ट लाइब्रेरी
- 15. बूस्ट :: इकाइयों
- 16. बूस्ट लाइब्रेरी
- 17. बूस्ट :: भावना
- 18. बूस्ट थ्रेड -
- 19. बूस्ट :: यूनिट्स
- 20. गिट, बूस्ट,
- 21. बूस्ट :: सिंगलटन_पूल
- 22. बूस्ट लाइब्रेरीज़
- 23. बूस्ट :: सॉकेटकैन
- 24. बूस्ट पीटा
- 25. बूस्ट :: enum
- 26. बूस्ट :: पायथन
- 27. बूस्ट प्रोसेस
- 28. बूस्ट :: serialization
- 29. बूस्ट पायथन
- 30. बूस्ट लाइब्रेरीज़
http://www.boost.org/doc/libs/1_36_0/libs/smart_ptr/scoped_ptr.htm#Handle/Body –