2014-11-24 4 views
26

यह पेज (http://www.cplusplus.com/reference/memory/shared_ptr/) में, अनुच्छेद 5, यह कहते हैं:साझा_प्टर के एलियासिंग कन्स्ट्रक्टर के लिए क्या है?

साथ ही, shared_ptr वस्तुओं स्वामित्व एक सूचक से अधिक है, जबकि एक ही समय में किसी अन्य वस्तु की ओर इशारा करते साझा कर सकते हैं। इस क्षमता को एलियासिंग (कन्स्ट्रक्टर देखें) के रूप में जाना जाता है, और आमतौर पर उस ऑब्जेक्ट के स्वामित्व के दौरान सदस्य ऑब्जेक्ट्स को इंगित करने के लिए उपयोग किया जाता है। इस वजह से, एक shared_ptr दो संकेत से संबंधित हो सकता है:

  • एक संग्रहीत सूचक है, जो सूचक यह इंगित करने के लिए कहा जाता है, और एक यह ऑपरेटर के साथ dereferences *।

  • एक स्वामित्व वाला सूचक (संभावित रूप से साझा), जो पॉइंटर स्वामित्व समूह कुछ बिंदु पर हटाने का प्रभारी है, और जिसके लिए यह उपयोग के रूप में गिना जाता है।

आम तौर पर, संग्रहीत सूचक और स्वामित्व सूचक एक ही वस्तु, लेकिन उर्फ ​​shared_ptr वस्तुओं (उर्फ निर्माता और उनके प्रतियों के साथ निर्माण किया गया है) का उल्लेख विभिन्न वस्तुओं का उल्लेख कर सकते।

फिर मैंने इस पृष्ठ (http://www.cplusplus.com/reference/memory/shared_ptr/shared_ptr/) को साझा_प्टर के एलियासिंग कन्स्ट्रक्टर के बारे में पढ़ा। लेकिन मुझे अभी भी यह "अलियासिंग" व्यवहार उलझन में लगता है। यह यहाँ क्यों है? ये किसके लिये है? मैं इस स्थिति में किस स्थिति में चाहूंगा?

+8

अपने स्वयं के उद्धरण से: "[एलियासिंग] आमतौर पर उस वस्तु के स्वामित्व के दौरान सदस्य वस्तुओं को इंगित करने के लिए उपयोग किया जाता है।" – hvd

+0

आपको पहले से ही एलियासिंग से परिचित होना चाहिए क्योंकि सी और सी ++ दोनों डिफ़ॉल्ट रूप से एलियासिंग की अनुमति देते हैं, यहां तक ​​कि 'shared_ptr' पर विचार किए बिना आप पहले से ही ऐसी भाषा का उपयोग कर रहे हैं जो डिफ़ॉल्ट रूप से एलियासिंग की अनुमति देता है। – user2485710

+0

@ एचवीडी हां। मैंने इस प्रश्न को पोस्ट करने के बाद बाद में यह देखा। लेकिन यह अभी भी पर्याप्त विशिष्ट नहीं है। – lqr

उत्तर

30

सरल उदाहरण:

struct Bar { 
    // some data that we want to point to 
}; 

struct Foo { 
    Bar bar; 
}; 

shared_ptr<Foo> f = make_shared<Foo>(some, args, here); 
shared_ptr<Bar> specific_data(f, &f->bar); 

// ref count of the object pointed to by f is 2 
f.reset(); 

// the Foo still exists (ref cnt == 1) 
// so our Bar pointer is still valid, and we can use it for stuff 
some_func_that_takes_bar(specific_data); 

एलियासिंग जब हम वास्तव में Bar ध्यान खींचना चाहते हैं के लिए है, लेकिन हम भी Foo हमें नीचे से बाहर हटाए जा सकते हैं नहीं करना चाहती।

const Bar& specific_data = Foo(...).bar; 

हम एक अस्थायी के एक सदस्य के लिए एक संदर्भ ले जा रहे हैं, लेकिन अस्थायी Foo अभी भी रखा जाता है:


जोहानिस टिप्पणी में बताते हैं, वहाँ कुछ हद तक एक बराबर भाषा विशेषता है specific_data के रूप में जीवित है। shared_ptr उदाहरण के साथ, हमारे पास Bar है जिसका जीवनकाल Foo - Foo से जुड़ा हुआ है जिसे हम एक्सेस नहीं कर सकते हैं।

+0

'लेकिन हम यह नहीं चाहते कि फू को हमारे नीचे से हटा दिया जाए, यह आपके 'shared_ptr' के लिए नौकरी है, जो वास्तव में एलियासिंग के लिए कुछ भी नहीं है। – user2485710

+1

@ user2485710 मुझे लगता है कि आप इस प्रश्न को गलत समझ रहे हैं? 'Shared_ptr 'मैंने बनाया है' वास्तव में 'shared_ptr ' के साथ स्वामित्व साझा कर रहा है। इन सभी में केवल एक अंतर्निहित वस्तु है, लेकिन एलियासिंग कन्स्ट्रक्टर हमें 'shared_ptr' देता है जो इसके बजाय किसी सदस्य को इंगित करता है। – Barry

+0

तो, यदि आप 'f' को रीसेट करना चाहते हैं तो आप का मतलब है, लेकिन आप नहीं चाहते हैं कि 'f' द्वारा ऑब्जेक्ट की गई वस्तु को नष्ट कर दिया जाए क्योंकि आपको इसकी सदस्य वस्तु की आवश्यकता होगी? ओह। बहुत बहुत धन्यवाद।मैं समझ गया। q ^।^पी – lqr

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

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