2013-03-11 7 views
12

मैं एक वर्ग A किस प्रकार std::unique_ptr के एक क्षेत्र है है:ले जाएँ स्वामित्व एसटीडी :: unique_ptr

class A 
{ 
public: 
    std::unique_ptr pointer; 
// class body 
}; 

और कहीं कोड में, मैं कुछ std::shared_ptr रों को जो बिंदु उपयोग कर रहा हूँ एक ही वस्तु अब मैं अपनी कक्षा में इस std::unique_ptr पर स्वामित्व को स्थानांतरित करना चाहता हूं, ताकि यदि सभी shared_ptr एस नष्ट हो जाएंगे, तो मेरा ऑब्जेक्ट तब तक जीवित रहेगा जब तक यह unique_ptr जीवित रहेगा।

मेरा सवाल है - क्या std::shared_ptr से std::unique_ptr से स्वामित्व को स्थानांतरित करना संभव है और यदि हां, तो मैं यह कैसे कर सकता हूं?

+8

तर्कसंगत रूप से ऐसा परिदृश्य मुझे समझ में नहीं आता है। मान लीजिए कि ओवरशिप को स्थानांतरित करना संभव है, लेकिन आप ऐसा कर सकते हैं * केवल जब आप सुनिश्चित हैं कि केवल ** एक ** 'shared_ptr' जीवित है; यदि ऐसा है, तो आप अभी भी 'ए' के ​​सदस्य के रूप में 'shared_ptr' का उपयोग कर सकते हैं और ** ** दिखाएं कि यह 'unique_ptr' है। – Nawaz

+1

"मेरी कक्षा में इस std :: unique_ptr के स्वामित्व को स्थानांतरित करें, ताकि यदि सभी shared_ptrs नष्ट हो जाएंगे, तो मेरा ऑब्जेक्ट तब तक जीवित रहेगा जब तक यह अद्वितीय_प्टर जीवित रहेगा ..." क्यों नहीं ए में एक और साझा किया जाता है? – qPCR4vir

+1

क्या होगा यदि एन अन्य साझा ptrs एक ही ऑब्जेक्ट को इंगित करते हैं? आप इसे कैसे संभालेंगे? 'shared_ptr' किसी कारण के लिए 'रिलीज' विधि प्रदान नहीं करता है। –

उत्तर

14

तर्कसंगत रूप से ऐसा परिदृश्य मुझे समझ में नहीं आता है।

थोड़ी देर के लिए मान लीजिए कि यह स्वामित्व स्थानांतरित करना संभव है, लेकिन आप उस केवल आप वाकई है कि वहाँ केवल एकshared_ptr Alives जब रहे कर सकता है; यदि ऐसा है, तो आप A और के सदस्य के रूप में का दावा कर सकते हैं कि यह unique_ptr है।

और फिर आप टिप्पणी की:

सच है कि, मैं एक वर्ग में shared_ptr बना सकते हैं। मुझे लगता है कि मैंने एक अवधारणा को थोड़ा सा गलत समझा। मैं इसे इस तरह से व्यवहार करना चाहता था: यदि unique_ptr मर जाता है, तो ऑब्जेक्ट भी मर जाता है, भले ही shared_ptr एस अभी भी इंगित करता है, लेकिन यह मूर्खतापूर्ण है क्योंकि वे नहीं जानते कि ऑब्जेक्ट स्वयं नष्ट हो गया था और इसलिए वे nullptr नहीं होंगे रों।

उस स्थिति में, आप गलत स्मार्ट पॉइंटर देख रहे हैं। आपको शायद std::weak_ptr कहा जाता है। यदि ऐसा है, तो सुनिश्चित करें कि आप एक std::shared_ptr और अन्य सभी को std::weak_ptr के रूप में उपयोग करें।

+3

वैसे, वास्तव में परिदृश्य मेरे लिए वैध रूप से आया क्योंकि मेरा कोड 'unique_ptr' (अच्छे कारणों से) का उपयोग करता है, लेकिन मुझे एक lib से डेटा प्राप्त करना है जो noncopyable प्रकारों को संभाल नहीं सकता है। निश्चित रूप से, मैं lib को ठीक करना चाहता हूं, लेकिन अपस्ट्रीम और तैनाती में समय लगेगा, इसलिए आपके पास यह है। –

संबंधित मुद्दे