2012-07-24 12 views
9

मैं एक संरचना है:कास्टिंग shared_ptr <T> shared_ptr को <void>

struct Params { 
    std::shared_ptr<void> user_data; 
    /* ... */ 
}; 

मैं इस तरह उपयोग करना चाहते हैं:

int main() { 
    std::shared_ptr<SpecializedParams> sp(new SpecializedParams(100)); 
    Params params; 
    /* ... */ 
    params.user_data = std::static_pointer_cast<void>(sp); 
    /* ... */ 
    std::shared_ptr<SpecializedParams> sp2 = 
    std::static_pointer_cast<SpecializedParams>(
     params.user_data 
    ); 
    /* ... */ 
    return 0; 
} 

इस वैध और सुरक्षित है?

+0

मुख्य ब्लॉक में पैराम क्या है? –

+0

आप एक शून्य सूचक 'हटा नहीं सकते हैं, इसलिए आपका कोड संकलित भी नहीं होना चाहिए। –

+2

@KerrekSB साझा पॉइंटर्स शून्य से निश्चित रूप से मान्य हैं। अधिक जानकारी के लिए यहां देखें: http://stackoverflow.com/questions/5913396/why-do-stdshared-ptrvoid-work –

उत्तर

7

कोड, जो कि साझा पॉइंटर बनने पर वास्तविक ऑब्जेक्ट को हटाता है, निर्धारित किया जाता है (यही कारण है कि साझा_प्टर को बनाते समय, और साझा_ptr को नष्ट करते समय आपको पूर्ण प्रकार की आवश्यकता होती है)। इस प्रकार जब भी आपका shared_ptr अंतिम सूचक है जो आपके स्पेशल पैराम्स ऑब्जेक्ट को इंगित करता है, तो ऑब्जेक्ट सही ढंग से नष्ट हो जाएगा।

3

यह सुरक्षित होना चाहिए क्योंकि शून्य कास्ट आइटम भी साझा_प्टर है। यह मौजूदा तत्व का संदर्भ जोड़ देगा और यह तब तक जारी नहीं किया जाएगा जब तक कि शून्य जाली वाली वस्तु दूर न हो जाए।

+2

यह कारण काम करता है कि 'shared_ptr ' ऑब्जेक्ट के साथ संग्रहीत छुपा डिलीटर फ़ंक्शन की वजह से ... अन्यथा बस 'शून्य' सूचक पर 'हटाएं' को कॉल करने से ऑब्जेक्ट के मेमोरी संसाधनों को सही ढंग से ' shared_ptr '। – Jason

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