2011-01-21 11 views
5

boost::weak_ptroperator< परिभाषित किया गया है, ताकि इसे सहयोगी कंटेनरों में उपयोग किया जा सके।बूस्ट के सॉर्ट ऑर्डर :: कमजोर_पीटीआर की समाप्ति के बाद?

मेरा प्रश्न है: क्या weak_ptr ऑब्जेक्ट्स का सॉर्ट ऑर्डर तब भी स्थिर है जब उनमें से कुछ शून्य की रीफ्रंट में बदल जाते हैं? क्या std::set जैसे कंटेनर के साथ गड़बड़ नहीं है?

उदाहरण:

using namespace boost; 
shared_ptr<A> sptrA1(new A); 
weak_ptr<A> wptrA1 = sptrA1; 
weak_ptr<A> wptrA2; 

{ // begin Scope 1 
    shared_ptr<A> sptrA2(new A); 
    wptrA2 = sptrA2; 
    assert(wptrA1 < wptrA2); // assert #1 
} 
assert(wptrA1 < wptrA2); // assert #2 
  • जोर होगा # 2 हमेशा सच है, तो ज़ोर # 1 सही है?
  • wptrA2 एक ही राज्य में स्कोप 1 से पहले और बाद में है?

उत्तर

5

boost::weak_ptr, operator< के वर्तमान कार्यान्वयन में एक सूचक संदर्भ की तुलना में एक आंतरिक संदर्भ-गणना-ट्रैकिंग संरचना की तुलना करता है। यह संरचना तब तक मुक्त नहीं होती है जब तक कि सभी मजबूत और कमजोर संदर्भ हटा दिए जाते हैं, इसलिए operator< का उपयोग करना सुरक्षित रहता है, भले ही संदर्भित उपयोगकर्ता डेटा को मजबूत संदर्भों की कमी के कारण मुक्त कर दिया गया हो।

+0

दिलचस्प। मैं http://www.boost.org/doc/libs/1_43_0/libs/smart_ptr/weak_ptr.htm में use_count के दस्तावेज़ द्वारा उलझन में था। यह कहता है "रिटर्न: 0 अगर * यह खाली है" हालांकि आपके उत्तर के मुताबिक रिवर्स (* यह 0 है तो यह खाली है) सही नहीं है, है ना? (यदि खाली को कमजोर_पीआरआर बनाने के लिए डिफ़ॉल्ट रूप से प्राप्त राज्य के रूप में परिभाषित किया गया है।) –

+0

मैंने यहां 'use_count'' के बारे में कोई बयान नहीं दिया है। कहा जाता है कि आंतरिक संदर्भ गिनती संरचना दो मायने रखती है - केवल मजबूत संदर्भों के लिए (जब यह शून्य हिट करता है, तो पॉइंट-टू-ऑब्जेक्ट नष्ट हो जाता है) और एक जिसमें मजबूत और कमजोर संदर्भ दोनों शामिल होते हैं (जब यह शून्य हो जाता है, संदर्भ-गणना संरचना नष्ट हो जाती है)। 'Use_count' फ़ंक्शन केवल मजबूत-गिनती को देख सकता है, लेकिन मैंने बिल्कुल जांच नहीं की है, इसलिए स्वयं के लिए सत्यापित करें। :) – bdonlan

2

weak_ptr तुलना here के बारे में पढ़ें।

+0

दिलचस्प पढ़ा। काफी मामूली समस्या नहीं है। –

1

std :: owner_less का उपयोग करें। यह उपयोग की गणना के सूचक की तुलना करता है, न कि पॉइंटर स्वयं। उदाहरण के लिए:

typedef std::weak_ptr<int> IntWPtr; 
std::set<IntWPtr, std::owner_less<IntWPtr> > m_set; 
+0

दिलचस्प है, हालांकि यह एक सी ++ 11 सुविधा है जिसे मैं इस समय उपयोग नहीं कर सकता। –

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