2010-12-01 19 views
6

के लिए मूल वाक्यविन्यास प्रश्न मैं साझा_ptr में नया हूं।shared_ptr

//first question 
shared_ptr<classA>ptr(new classA()); //works 
shared_ptr<classA>ptr; 
ptr = ?? //how could I create a new object to assign it to shared pointer? 


//second question 
shared_ptr<classA>ptr2; //could be tested for NULL from the if statement below 
shared_ptr<classA> ptr3(new classA()); 
ptr3 = ?? //how could I assign NULL again to ptr3 so that the if statement below becomes true? 

if(!ptr3) cout << "ptr equals null"; 

उत्तर

10
shared_ptr<classA> ptr; 
ptr = shared_ptr<classA>(new classA(params)); 
// or: 
ptr.reset(new classA(params)); 
// or better: 
ptr = make_shared<classA>(params); 

ptr3 = shared_ptr<classA>(); 
// or 
ptr3.reset(); 

संपादित करें:: मैं सी की वाक्य रचना ++ 0x shared_ptr के रूप में नीचे के बारे में कुछ प्रश्न पूछना चाहते हैं बस संक्षेप में प्रस्तुत करने क्यों make_sharednew को सुस्पष्ट रूप से कॉल करने के लिए पसंद किया जाता है:

  1. कुछ (सभी?) कार्यान्वयन वस्तु के निर्माण और काउंटर/डिलीटर के लिए एक स्मृति आवंटन का उपयोग करते हैं। यह प्रदर्शन बढ़ता है। , के बाद से मूल्यांकन के क्रम में परिभाषित नहीं है

    f(shared_ptr<A>(new A), shared_ptr<B>(new B)); 
    

    एक संभव मूल्यांकन हो सकता है:

  2. यह अपवाद सुरक्षित है, एक समारोह दो shared_ptrs लेने पर विचार प्रारंभ share_ptr<A> बी का निर्माण का निर्माण एक,,, प्रारंभ shared_ptr<B>। यदि बी फेंकता है, तो आप ए

  3. जिम्मेदारी का पृथक्करण करेंगे। यदि shared_ptr हटाने के लिए ज़िम्मेदार है, तो इसे आवंटन के लिए भी जिम्मेदार बनाएं।

+0

क्यों यहां बेहतर make_shared है के साथ का उपयोग करके? –

+2

@ फ्रेड: जिम्मेदारी का पृथक्करण। 'make_shared <>' लाइब्रेरी को 'नया' संभालने की अनुमति देता है, इसलिए आपका कोड स्पष्ट रूप से असंतुलित 'नया' आमंत्रण प्रदर्शित नहीं करता है। लाइब्रेरी 'डिलीट' करती है, इसलिए इसे 'नया' भी करना चाहिए। –

+0

@ फ्रेड नर्क: 'make_shared' संभावित रूप से एक आवंटन को समाप्त कर सकता है। – ybungalobill

0

मैं कैसे बना सकते हैं करने के लिए एक नई वस्तु साझा सूचक के लिए असाइन करें?

आप "रीसेट" को साझा सूचक है:

classA* my_pointer = new classA(); 
shared_ptr<classA>ptr; 
ptr.reset(my_pointer); 

कैसे मैं शून्य आवंटित कर सकते हैं फिर से ptr3 को ताकि यदि नीचे बयान सच हो जाता है?

फिर

, रीसेट, लेकिन कोई तर्क (या अशक्त)

ptr3.reset(); 
संबंधित मुद्दे