2016-08-11 16 views
14

की सामग्री को इंगित करना मेरे पास std::unique_ptr और दूसरा कच्चा सूचक है। मैं चाहता हूं कि कच्चे सूचक किसी भी प्रकार के स्वामित्व के बिना unique_ptr की सामग्री को इंगित करें। यह केवल पढ़ने के लिए रिश्ते है:std :: unique_ptr

auto bar=std::make_unique<foo>(); 
auto ptr=bar.get();// This may point to another value later 

क्या यह बुरा है? क्या कोई विकल्प है?

नोट: वास्तविक उदाहरण अधिक जटिल है। वे एक ही कक्षा में नहीं हैं।

+2

क्या यह 'bar.get();' नहीं होना चाहिए? –

+0

@ πάνταῥεῖ हाँ क्षमा करें –

+3

मैं कहूंगा कि यह आदर्श है। लेकिन मैं शायद एक अलग नाम चुनूंगा क्योंकि अलग-अलग अर्थशास्त्र के साथ पहले से ही 'std :: weak_ptr' है। – Galik

उत्तर

25

आपको लगता है कि ए) गारंटी ले सकते हैं, तोbar के जीवनकाल ptr के जीवनकाल से अधिक होगा, और बी) कि कोई प्रोग्रामर/रिफैक्टरिंग कभी किसी भी बिंदु पर delete ptr; लिखेंगे, तो यह बिल्कुल ठीक है और शायद है किसी भी परिस्थिति के लिए आदर्श जहां आपको स्वामित्व के बिना पॉइंटर्स पास करने की आवश्यकता है।

यदि उन दो स्थितियों की गारंटी नहीं दी जा सकती है, तो आपको शायद std::shared_ptr और std::weak_ptr का उपयोग करना चाहिए।

+7

और शायद आपको 'shared_ptr' का उपयोग नहीं करना चाहिए, क्योंकि 99%" प्रतीक्षा करें, मैं अपनी संसाधन समस्याओं को 'shared_ptr'' के साथ हल कर सकता हूं, जो एक बुरा विचार है। – Yakk

+5

@Yakk सबसे अच्छा, मैं उस हाइपरबॉलिक को बुलाऊंगा, और सबसे खराब, बेवकूफ। मुझे सी ++ भूमि में कई समस्याएं आई हैं, जहां सबसे अच्छे, सबसे बेवकूफ समाधान ने 'std :: shared_ptr' के उपयोग को बुलाया। मैं आपको बता दूंगा कि पहली जगह पॉइंटर्स पर निर्भरता डिजाइन जटिलता के कारण (या लक्षण) का प्रतिनिधित्व करती है, लेकिन यदि वे '99% समय' खराब थे, जावा (जो मूल रूप से 'shared_ptr' जैसी वस्तुओं का उपयोग करता है अपने सभी पॉइंटर्स के लिए) एक भाषा के रूप में उपयोग करने योग्य नहीं होगा, और हम जानते हैं कि यह मामला नहीं है। – Xirema

+5

क्या हम वास्तव में जानते हैं? लेकिन गंभीरता से, जावा पूर्ण जीसी पॉइंटर्स का उपयोग करता है, जो आरसी पॉइंटर्स की तुलना में एक अलग जानवर हैं। किसी भी प्रकार के वास्तविक जीसी सूचक के रूप में आरसी पॉइंटर्स के बारे में सोचना एक घटक के डिजाइन में मौलिक त्रुटि का संकेत है, और ऐसी त्रुटियां 99% का हिस्सा हैं। मुझे ऐसी स्थितियां मिली हैं जहां साझा पॉइंटर्स सही हैं (जब आपके पास कुछ संसाधनों का वास्तविक * साझा स्वामित्व * है, न कि "मैं यहां पॉइंटर समस्याओं को खतरे में डालना नहीं चाहता हूं"), लेकिन शायद ही कभी एक सामान्य स्वामित्व वाली आजीवन समस्या हो सकती है सिस्टम में साझा और कमजोर पॉइंटर्स को केवल झुकाव से हल किया जाए। – Yakk

26

नहीं, यह बुरा नहीं है, और जब तक मानक पुस्तकालय proposed std::observer_ptr को शामिल किया गया है, यह एक गैर मालिक पर्यवेक्षक को व्यक्त करने का मुहावरेदार तरीका है।

+3

और उसके बाद भी, यह प्रतिनिधित्व करने का मूर्खतापूर्ण तरीका होगा। कोर सी ++ दिशानिर्देश 'observer_ptr' का उपयोग करने के लिए नहीं कहते हैं; वे कहते हैं कि सभी नग्न 'टी * गैर-स्वामित्व का प्रतिनिधित्व करते हैं। –

+5

@ निकोलबोलस यह एक सवाल है कि क्या वे अभी भी कहेंगे कि 'std :: experimental :: observer_ptr' के बाद 'std :: observer_ptr' बन जाता है। मैं कल्पना कर सकता हूं कि दिशानिर्देश गैर-स्वामित्व के रूप में "पढ़ा गया टी *' में बदल रहा है, लेकिन गैर-स्वामित्व को 'std :: observer_ptr ' के रूप में लिखें। " – Angew

+2

"* यह एक सवाल है कि क्या वे अभी भी कहेंगे कि 'std :: experimental :: observer_ptr'' std :: observer_ptr' बन जाता है। * "और यह एक सवाल है कि वास्तव में यह वास्तव में होगा; प्रस्तावित होने और मूल मानक में अपनाए जाने के बीच टीएस का परिवर्तन। साथ ही, यह मौजूदा सी ++ कोड की * अरबों * जादुई रूप से परिवर्तित नहीं करेगा जो अज्ञात पॉइंटर्स के लिए नग्न पॉइंटर्स का उपयोग करता है। –

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