2012-05-24 18 views
8

में पॉइंटर्स क्यों स्कॉप्ड पॉइंटर का उद्देश्य है? मेरी समझ के लिए, स्कॉप्ड पॉइंटर कोड के ब्लॉक के भीतर स्मृति का प्रबंधन करता है। अगर मैं एक ब्लॉक के भीतर एक चर घोषित करना चाहता हूं, तो मैं इसे केवल ढेर पर घोषित कर सकता हूं और सफाई के बारे में चिंता नहीं कर सकता।बूस्ट

+0

http://www.boost.org/doc/libs/1_36_0/libs/smart_ptr/scoped_ptr.htm#Handle/Body –

उत्तर

1

बिंदु यह है कि आप एक निश्चित शब्दावली के भीतर एक सूचक बना और साफ कर सकते हैं। यह विभिन्न स्थितियों में उपयोगी हो सकता है, और यह सुनिश्चित करता है कि 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 
4

नहीं अगर यह गतिशील आकार या प्रकार का है। इसके अलावा, स्कोप्ड पॉइंटर्स को स्वैप किया जा सकता है, और सी ++ 11 unique_ptr में स्थानांतरित किया जा सकता है, इसलिए वे कड़ाई से स्कॉप्ड नहीं हैं।

+1

है कि "प्राथमिक कारण सिवाय 'auto_ptr' की बजाय' scoped_ptr' का उपयोग अपने कोड के पाठकों को यह बताने के लिए है कि आप "संसाधन अधिग्रहण प्रारंभिकरण" का इरादा केवल मौजूदा दायरे के लिए लागू किया जाना है, और स्वामित्व को स्थानांतरित करने का कोई इरादा नहीं है "... जैसा लगता है 'स्वैप 'एक इच्छित उपयोग नहीं है। –

+0

@BenVoigt: लेकिन यह प्रदान किया जाता है और इसका उपयोग किया जा सकता है। – Puppy

+2

यहां [एक पुराना धागा] है (http://lists.boost.org/Archives/boost/2002/09/36359.php) चर्चा करना क्यों 'स्वैप' एक आवश्यकता बन गई (मूल रूप से 'scoped_ptr' को सदस्य के रूप में उपयोग किया जा सकता है एक प्रतिलिपि वर्ग के)। –

0

आमतौर पर थ्रेड स्टैक्स में मेमोरी सीमा होती है (थ्रेड स्टैक्सइज़ देखें)।

कभी-कभी सूचक आपको बाहर से पास कर दिया गया हो सकता है और इस दायरे में हटा दिया जाना चाहिए (उदाहरण के लिए यदि कोई अपवाद फेंक दिया गया है, तो उस पंक्ति के नीचे कोई भी डिलीट कॉल निष्पादित नहीं होगा)। तो अगर आप की किसी न किसी प्रकार की जरूरत है ऑटो जादुई सूचक

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(); 
} 
+0

मैं स्टैक पर पॉइंटर घोषित कर सकता हूं और जब फ़ंक्शन स्कोप से बाहर हो जाता है, तो सफलतापूर्वक या अपवाद के माध्यम से इसे स्वचालित रूप से साफ़ कर दिया जाएगा। सही बात? – Jimm

+0

{एक्स * एक्स = और कुछ ओबीजे; } इससे पॉइंटर एक्स को दायरे से बाहर होने पर हटाया नहीं जाएगा। जब यह दायरे से बाहर हो जाता है तो कुछ ओबीजे हटा दिए जाएंगे। {एक्स * वाई = नया एक्स();} इस प्रकार के कोड को ऑटो क्लीन अप – mohaps

2

सफाई ढेर आधारित डेटा के विपरीत, 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?

+0

'बूस्ट :: संस्करण ' के लिए स्कॉप्ड पीआरटी की आवश्यकता होगी। :) – GManNickG

+0

@GManNickG: मुझे नहीं लगता कि boost :: variant scoped_ptr के माध्यम से polymorphism के लिए एक अच्छा प्रतिस्थापन प्रदान करता है - दिलचस्प हालांकि। धन्यवाद! – nobar

+0

आपको ऐसा क्यों नहीं लगता? – GManNickG