2014-09-16 6 views
15

मैं std::shared_ptr का स्मार्ट व्यवहार रखना चाहता हूं। तो क्या संदर्भ गणना को भ्रमित किए बिना साझा किए गए पॉइंटर को किसी अन्य प्रकार पर डालने का कोई तरीका है? मुझे कच्चा सूचक नहीं मिल सकता है और इससे नया साझा पॉइंटर बनाया जा सकता है।क्या साझा_ptr <void> को साझा_ptr <T> पर साझा करने का कोई तरीका है?

+1

http://stackoverflow.com/questions/6795629/how-does-one-downcast-a-stdshared-ptr –

+0

@ बिलीओनेल: नहीं, 'शून्य' सभी प्रकार की मूल श्रेणी नहीं है। सी ++ वह शुद्ध ओओ नहीं है। – MSalters

+0

@MSalters: यही कारण है कि मैंने वास्तविक मतदान को बंद करने के बजाय टिप्पणी लिखा था (मैं इसे एकतरफा नहीं करना चाहता था) –

उत्तर

20

आप 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* अपरिभाषित व्यवहार से चलाता है कभी नहीं है।

+0

इस उत्तर के पिछले संस्करण में गलत 'shared_ptr उदाहरण शून्य (नया MyClass)' भाग था जो मेरे पास है तय की। मेरे पैर को मेरे मुंह में डालने के लिए अपवॉट को हटाने के लिए स्वतंत्र महसूस करें: पी –

+1

+1 अधिक पूर्ण उत्तर प्रदान करने के लिए +1, यह भी स्वीकार करता है कि आपने गलती की है, इसे स्वीकार कर रहा है और इसे ठीक करने के लिए प्रोत्साहित किया जाना चाहिए, हम में से अधिकांश सीखने के लिए यहां हैं और यह एक हिस्सा है प्रक्रिया का। –

+1

मैं क्रॉस कर रहा हूं क्योंकि आपने संपादन के लिए उत्तर हटा दिया है क्योंकि मैं गलत उदाहरण के बारे में एक टिप्पणी लिख रहा था ;-) –

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