मैं std::shared_ptr
का स्मार्ट व्यवहार रखना चाहता हूं। तो क्या संदर्भ गणना को भ्रमित किए बिना साझा किए गए पॉइंटर को किसी अन्य प्रकार पर डालने का कोई तरीका है? मुझे कच्चा सूचक नहीं मिल सकता है और इससे नया साझा पॉइंटर बनाया जा सकता है।क्या साझा_ptr <void> को साझा_ptr <T> पर साझा करने का कोई तरीका है?
उत्तर
आप rob mayoff's answer से पॉइंटर कास्ट का उपयोग कर सकते हैं; लेकिन सावधान रहना।
struct MyClass {};
void* rawPtr = new MyClass;
shared_ptr<void> exampleVoid(rawPtr); // Undefined behavior;
// calls delete (void*)ptr;
shared_ptr<void> exampleVoidCons(new MyClass);
// OK, calls shared_ptr<void>::shared_ptr<MyClass>(MyClass*) which
// makes a deleter calling delete (MyClass*)ptr;
shared_ptr<MyClass> example(new MyClass); // OK, calls delete (MyClass*)ptr;
shared_ptr<void> castToVoid = static_pointer_cast<void>(example);
// OK, shared_ptr's deleter is erased so this still calls delete (MyClass*)ptr;
आमतौर पर यह अपरिभाषित व्यवहार प्रकार नाशक नहीं बुलाया जा रहा है में परिणाम होगा: यह अनजाने यहाँ अपरिभाषित व्यवहार को गति प्रदान करने के लिए आसान है। उदाहरण के लिए, see the output on ideone और ध्यान दें कि संस्करण void*
में डाला गया है कभी प्रिंट नहीं करता है कि यह नष्ट हो गया था।
देखें सी ++ 11 5.3.5 [expr.delete]/3:
पहले विकल्प में (वस्तु हटाना), अगर वस्तु के स्थिर प्रकार हटाए जाने के लिए अलग है इसके गतिशील प्रकार से, स्थैतिक प्रकार हटाए जाने वाले ऑब्जेक्ट के गतिशील प्रकार का आधार वर्ग होगा और स्थैतिक प्रकार में आभासी विनाशक होगा या व्यवहार अपरिभाषित होगा।
के बाद से वास्तविक वस्तु एक गतिशील प्रकार void
कभी नहीं होगा, और void
एक गतिशील प्रकार का एक आधार वर्ग, delete
ing एक void*
अपरिभाषित व्यवहार से चलाता है कभी नहीं है।
इस उत्तर के पिछले संस्करण में गलत 'shared_ptr उदाहरण शून्य (नया MyClass)' भाग था जो मेरे पास है तय की। मेरे पैर को मेरे मुंह में डालने के लिए अपवॉट को हटाने के लिए स्वतंत्र महसूस करें: पी –
+1 अधिक पूर्ण उत्तर प्रदान करने के लिए +1, यह भी स्वीकार करता है कि आपने गलती की है, इसे स्वीकार कर रहा है और इसे ठीक करने के लिए प्रोत्साहित किया जाना चाहिए, हम में से अधिकांश सीखने के लिए यहां हैं और यह एक हिस्सा है प्रक्रिया का। –
मैं क्रॉस कर रहा हूं क्योंकि आपने संपादन के लिए उत्तर हटा दिया है क्योंकि मैं गलत उदाहरण के बारे में एक टिप्पणी लिख रहा था ;-) –
आप किस प्रकार की कास्ट के आधार पर std::static_pointer_cast
या std::dynamic_pointer_cast
का उपयोग कर सकते हैं।
- 1. डाउनकास्टिंग share_ptr <Base> साझा_ptr <Derived> पर?
- 2. क्या साझा_ptr
- 3. क्या साझा_ptr
- 4. साझा_ptr
- 5. साझा_ptr <A> क्यों साझा नहीं किया गया है shared_ptr <A const> में?
- 6. const_ptr को साझा_ptr
- 7. एक साझा_ptr
- 8. क्या __restrict__ को साझा_ptr <T> पर लागू किया जा सकता है?
- 9. "कनेक्टिंग" एसडीएल_Surface को साझा_ptr
- 10. पासिंग कॉन्स shared_ptr <T> और बनाम साझा_ptr <T> पैरामीटर
- 11. बूस्ट पायथन और साझा_ptr
- 12. अग्रेषित घोषणाएं और साझा_ptr
- 13. साझा_ptr <void> कानूनी क्यों है, जबकि unique_ptr <void> खराब गठित है?
- 14. क्या साझा_ptr स्वैप थ्रेड सुरक्षित है?
- 15. क्यूलिस्ट और साझा_ptr
- 16. स्पष्ट रूप से एक साझा_ptr
- 17. सी ++ स्टैक ऑब्जेक्ट के साझा_ptr
- 18. विरासत द्वारा साझा_ptr को विस्तारित करना
- 19. कच्चे सूचक से साझा_ptr बनाना
- 20. क्या रूबी में << ऑपरेटर को ओवरराइड करने का कोई तरीका है?
- 21. बूस्ट का उपयोग :: लाइब्रेरी के सार्वजनिक इंटरफेस में साझा_ptr
- 22. एक साझा_ptr स्वैप करने की कोशिश कर रहे अजीब त्रुटि()
- 23. एक साझा_ptr लौटने पर कॉन्वेंट रिटर्न प्रकार कैसे पूरा करें?
- 24. क्या शुद्ध सीएसएस में <tbody /> पर सीमाएं प्राप्त करने का कोई साफ तरीका है?
- 25. क्या जीसीसी पर 128 बिट इन्ट्स करने का कोई तरीका है <4.4
- 26. GoogleMock मेरा साझा_ptr क्यों लीक कर रहा है?
- 27. <% $, <% @, <% =, <% # ... सौदा क्या है?
- 28. क्या कोई स्थिर विश्लेषण उपकरण है जो shared_ptr <> परिपत्र संदर्भों का पता लगाने में सहायता कर सकता है?
- 29. क्या सीई द्वारा एचटीएमएल <select> और आईई 6 पर <option> को बढ़ाने का कोई तरीका है?
- 30. क्या पी (एक <= एक्स <= बी) प्रदर्शित करने के लिए अभिव्यक्ति() प्राप्त करने का कोई तरीका है?
http://stackoverflow.com/questions/6795629/how-does-one-downcast-a-stdshared-ptr –
@ बिलीओनेल: नहीं, 'शून्य' सभी प्रकार की मूल श्रेणी नहीं है। सी ++ वह शुद्ध ओओ नहीं है। – MSalters
@MSalters: यही कारण है कि मैंने वास्तविक मतदान को बंद करने के बजाय टिप्पणी लिखा था (मैं इसे एकतरफा नहीं करना चाहता था) –