2010-03-03 11 views
10

मैंने cyclic संदर्भ को तोड़ने के लिए share_ptr के साथ काम कर रहे weak_ptr के बारे में बहुत कुछ सीखा। यह कैसे काम करता है? इसका उपयोग कैसे करें? क्या कोई शरीर मुझे एक उदाहरण दे सकता है? मैं यहाँ पूरी तरह से खो गया हूँ।क्यों weak_ptr चक्रीय संदर्भ तोड़ सकता है?

एक और सवाल, एक मजबूत सूचक क्या है?

+0

"_ यह कैसे काम करता है? _" यह सामान्य रूप से नहीं है। यह एक पागल विचार है। आपको डिजाइन स्तर पर चक्र को हटाना होगा। – curiousguy

+1

@curiousguy कुछ दृश्य मौजूद हैं जो आपकी विधि काम नहीं करते हैं, यानी जब चक्रवात संदर्भों को _by design_ पेश किया जाता है। उदाहरण के लिए, जीसी के बिना गतिशील भाषा का दुभाषिया प्रथम श्रेणी के लैम्ब्डा फ़ंक्शन का समर्थन करता है जो संलग्न वातावरण में अपना नाम कैप्चर करके देशी रिकर्सन की अनुमति देता है (इसलिए जब इसे स्थानीय रूप से बनाया जाता है और फिर प्रथम श्रेणी के मान के रूप में लौटाया जाता है, तो कुछ भी नहीं यह, और वहाँ चक्रीय संदर्भ होने के लिए है; यह परंपरागत रूप से _downward funarg problem_ के रूप में जाना जाता है और शास्त्रीय समाधान एक जीसी का उपयोग कर रहा है)। – FrankHB

उत्तर

6

यह संदर्भ संख्या में शामिल नहीं है, इसलिए संसाधन कमजोर पॉइंटर्स मौजूद होने पर भी मुक्त किया जा सकता है। कमजोर_प्टर का उपयोग करते समय, आप इससे साझा_ptr प्राप्त करते हैं, अस्थायी रूप से संदर्भ गणना को बढ़ाते हैं। अगर संसाधन पहले से ही मुक्त कर दिया गया है, तो साझा_प्टर प्राप्त करना विफल हो जाएगा।

प्रश्न 2: shared_ptr एक मजबूत सूचक है। जब तक उनमें से कोई भी अस्तित्व में है, संसाधन को मुक्त नहीं किया जा सकता है।

8

एक मजबूत सूचक वस्तु के लिए एक मजबूत संदर्भ रखता है - अर्थ: जब तक सूचक मौजूद है, वस्तु नष्ट नहीं होती है।

ऑब्जेक्ट प्रत्येक पॉइंटर के व्यक्तिगत रूप से "पता" नहीं है, केवल उनकी संख्या - यह मजबूत संदर्भ गणना है।

एक कमजोर_प्टर प्रकार वस्तु को "याद करता है", लेकिन इसे नष्ट होने से नहीं रोकता है। आप ऑब्जेक्ट को कमजोर पॉइंटर के माध्यम से सीधे एक्सेस नहीं कर सकते हैं, लेकिन आप कमजोर पॉइंटर से मजबूत पॉइंटर बनाने की कोशिश कर सकते हैं। यदि ऑब्जेक्ट अब मौजूद नहीं है, परिणामी मजबूत सूचक शून्य है:

shared_ptr<int> sp(new int); 
weak_ptr<int> wp(sp); 

shared_ptr<int> stillThere(wp); 
assert(stillThere); // yes, the original object still exists, we can now use it 
stillThere.reset(); // releasing the strong reference 

sp.reset();   // here, the object gets destroyed, 
        // because there's only one weak_ptr left 

shared_ptr<int> notReally(wp); 
assert(!notReally); // the object is destroyed, 
        // you can't get a strong pointer to it anymore 
+0

कोड नमूना आपके स्पष्टीकरण को बहुत अच्छी तरह से पूरा करता है। –