2011-03-01 7 views
42

अशक्त संकेत की जाँच के लिए आदत से बाहर, मैं कभी कभी लिखा है:पोर्टेबल सुरक्षित/शून्य से गतिशील_कास्ट पास करने के लिए सुरक्षित है?

MyClass * c = someBasePtr ? dynamic_cast<MyClass*>(someBasePtr) : 0; 
if (c) {... 

वास्तव में, गतिशील कलाकारों को पारित करने, और भी वापसी की जाँच से पहले एक अशक्त सूचक के लिए जाँच।

मैं तो MSDN प्रलेखीकरण

एक नल पॉइंटर मूल्य dynamic_cast द्वारा गंतव्य प्रकार के नल पॉइंटर मूल्य में बदल जाती है में पढ़ा।

ऐसा प्रतीत होता है कि मैं इसे हटा सकता हूं?: सुरक्षित रूप से निर्माण करें। क्या यह सी ++ पोर्टेबल है?

इस तरह की है कि नए कोड

MyClass * c = dynamic_cast<MyClass*>(someBasePtr); 
if (c) {... 
पाठ्यक्रम यह मानते हुए कि someBasePtr या तो नल या वैध है के

अर्थात नहीं जंगली कचरा की ओर इशारा करते ...

उत्तर

58

§5.2.7/4:

तो वी का मूल्य सूचक मामले में एक नल पॉइंटर मूल्य है, परिणाम प्रकार आर के नल पॉइंटर मूल्य है

तो आपको अपने आप को एक नल पॉइंटर की जांच करने की आवश्यकता नहीं है। ऑपरेटर हटाने के लिए वही जाता है, एक शून्य पॉइंटर को हटाने से कोई प्रभाव नहीं पड़ता है।

20

हाँ, आप कर सकते हैं हो सकता है एक शून्य सूचक पर dynamic_cast का उपयोग करें।

+5

+1। जैसा कि 5.2.7/4 – Erik

4

हां, मानक में 5.2.7.4 की जांच करें।

0

मैं इसके बारे में उत्सुक था और इस उत्तर को गुगल करने से पहले इसे आजमाया। निम्नलिखित कोड C++ 14 में कोई त्रुटि उत्पन्न नहीं करता है।

class A { 
public: 
    virtual ~A() {} 
}; 
class B: A {}; 
#include <iostream> 
int main() { 
    A* error_pointer = nullptr; 
    B* x = dynamic_cast<B*>(error_pointer); 
    std::cout<<"No errors :)\n"; 
} 

टेस्ट इसे यहाँ: http://ideone.com/0dSf5p

+0

में उल्लिखित है, डाउनवोट क्यों? मैंने कामकाजी उदाहरण जोड़ा ताकि हर कोई इसका परीक्षण कर सके ... इसके बारे में क्या गलत हो सकता है? –

+4

मैं डाउनवॉटेड नहीं था लेकिन सवाल यह है कि यह विनिर्देशन में ऐसा करने के लिए मान्य है, और यदि यह पोर्टेबल है। स्वीकृत उत्तर के अनुसार, यह मानक के अनुसार मान्य है, लेकिन यदि यह नहीं था, तो मान लें कि यह अपरिभाषित था, आपका उदाहरण किसी विशेष कंपाइलर में काम कर सकता था, लेकिन अगर यह पोर्टेबल है या नहीं तो यह जवाब नहीं देगा । – user3533716

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