से कच्चे सूचक को रिसाव करने के लिए पोर्टेबल हैक मेरे पास ऑब्जेक्ट संरचना है जो shared_ptr
एस, प्लस weak_ptr
एस परिपत्र से बचने के लिए बनाई गई है। कच्चे पॉइंटर्सboost::serialization
को क्रमबद्ध और कमजोर पॉइंटर्स को पुनर्स्थापित करने की आवश्यकता है जब ऑब्जेक्ट ट्रैकिंग के माध्यम से क्रमबद्धता समय के रूप में deserializing। ऑब्जेक्ट आजीवन पैटर्न जटिल (कण सिमुलेशन) हैं लेकिन पूरी तरह अनुमानित हैं। जब भी मैं weak_ptr::lock()
का उपयोग करता हूं, मुझे यकीन है कि सूचक अभी भी मान्य है। आम तौर पर, मैं lock().get()
का उपयोग करता हूं क्योंकि मुझे केवल बहुत ही कम समय के लिए ऑब्जेक्ट की आवश्यकता होती है।पोर्टेबल हैक कमजोर_पीआरआर
अब, lock().get()
के रूप में यह साझा गिनती में वृद्धि करेगा (lock()
में), और फिर इसे शीघ्र ही बाद में घटती (अस्थायी shared_ptr
विलुप्त है) प्रदर्शन प्रभाव पड़ता है,।
यह boost.devel post 2002 से कहते हैं कि जब तक weak_ptr
विकसित किया जा रहा था, कच्चे सूचक सीधे माना जाता था तक पहुँचने की कार्यक्षमता (unsafe_get
या leak
नामित किया जाना है), लेकिन वास्तविक क्रियान्वयन के लिए इसे बनाया कभी नहीं। इसकी अनुपस्थिति प्रोग्रामर को दी गई स्थितियों के तहत उप-स्थानिक इंटरफ़ेस का उपयोग करने के लिए मजबूर करती है।
अब, सवाल unsafe_get
/leak
अनुकरण करने के लिए कैसे, एक और शब्दों में,, weak_ptr
से कच्चे सूचक मिल प्रोग्रामर के जोखिम पर अवैध, केवल (नहीं लिख) डाटा पढ़ने है। मैं कल्पना कर सकता हूं कि कुछ चालबाजी shared_ptr
के अंदर कच्चे सूचक के ऑफसेट को खोजने की तरह है या ऐसा काम करेगा।
मैं boost::shared_ptr
का उपयोग कर रहा हूं, लेकिन समाधान सी ++ 11 के std::shared_ptr
के लिए भी काम कर सकता है।
अच्छा सवाल है लेकिन यह ईमानदारी से कच्चे पॉइंटर्स की तरह लगता है कि यह बेहतर सौदा होगा। वस्तुओं को अलग से प्रबंधित करें (उदा। अपने सभी कणों को एक कंटेनर में पूल करें) और उन लोगों को कमजोर पॉइंटर्स पास करें। –
मुझे लगता है कि यदि आप केवल थोड़े समय के लिए ऑब्जेक्ट का उपयोग कर रहे हैं, तो आप इसे इस्तेमाल करते समय 'shared_ptr' रखना चाहिए:' auto s = w.lock(); अगर (एस) एस-> कुछ करना(); 'मुझे लगता है कि' लॉक() का उपयोग करना।() 'खराब अभ्यास है और कोई तेज़ नहीं है। यह संभव है कि सूचक का उपयोग करने की बहुत ही क्रिया वास्तव में अंतिम 'shared_ptr' मरने के लिए ट्रिगर कर सकती है। –
यदि आप वस्तुओं के जीवनकाल को '.lock()' के बिना कमजोर इंगित करते हैं, तो 'weak_ptr' का उपयोग न करें। क्या आपने साबित किया है कि यह एक तरफ एक प्रदर्शन बाधा है? – Yakk