दिलचस्प पोस्ट
Install.packages का उपयोग करके आर-फोर्ज पैकेज इंस्टॉल नहीं कर सकते एक HTTP प्राप्त करें के साथ एक अर्रे भेजें मैं जीआईटी में अपनी स्थानीय कार्यरत निर्देशिका को कैसे साफ़ कर सकता हूं? संदर्भ से एक सरणी उत्तीर्ण प्रत्येक 'लूप' काम के लिए जावा कैसे करता है? क्या स्काला 2.8 संग्रह लाइब्रेरी "इतिहास में सबसे लंबे समय तक आत्महत्या नोट" का मामला है? जावा में सापेक्ष पथ के साथ खुले संसाधन रूपांतरण के लिए जावा स्ट्रिंग मैं कैसे पता लगा सकता है कि किस DOM तत्व का ध्यान केंद्रित है? कैसे वादे के साथ पूर्व परिणामों को चेन और साझा करने के लिए जांच करें कि कोई उपयोगकर्ता नीचे स्क्रॉल कर रहा है या नहीं वेबब्राउज़र पूर्ण पृष्ठ लोड हो रहा है मैं जावास्क्रिप्ट ऑब्जेक्ट से संपत्ति कैसे निकालूं? NSManagedObject के विशिष्ट उपवर्ग खोजने में असमर्थ 3 डी स्थिति को 2 डी स्क्रीन स्थिति में परिवर्तित करना

जब मैं एक न्यूल ऑब्जेक्ट पॉइंटर पर सदस्य फ़ंक्शन कॉल करता हूं, तो क्या होगा?

मुझे एक इंटरव्यू प्रश्न के रूप में निम्नलिखित दिया गया था:

class A { public: void fun() { std::cout << "fun" << std::endl; } }; A* a = NULL; a->fun(); 

क्या होगा जब यह कोड निष्पादित होगा, और क्यों?


यह भी देखें:

  • एक नल उदाहरण पर किसी सदस्य फ़ंक्शन को लागू करते समय क्या अपरिभाषित व्यवहार होता है?

वेब के समाधान से एकत्रित समाधान "जब मैं एक न्यूल ऑब्जेक्ट पॉइंटर पर सदस्य फ़ंक्शन कॉल करता हूं, तो क्या होगा?"

यह अपरिभाषित व्यवहार है, इसलिए कुछ भी हो सकता है

संभव परिणाम यह होगा कि यह सिर्फ "fun" प्रिंट करता है क्योंकि विधि किसी ऑब्जेक्ट के किसी भी सदस्य चर तक नहीं पहुंचती (जिसे स्मृति माना जाता है, जिस वस्तु को माना जाता है कि उसे एक्सेस करने की आवश्यकता नहीं है, इसलिए प्रवेश उल्लंघन टी जरूरी होती है)।

मानक से, यह अपरिभाषित व्यवहार है और इसलिए एक बहुत बुरी चीज है वास्तविकता में अधिकांश प्रोग्रामिंग प्लेटफार्म (दोनों एक्स 86 और कई अन्य आर्किटेक्चर में) यह ठीक चलेंगे।

क्यूं कर? सी ++ में क्लास फ़ंक्शंस कैसे लागू किए जाते हैं, इस पर विचार करें। यह एक आभासी फ़ंक्शन नहीं है, इसके लिए यह ज्ञात पते पर स्थिर कॉल हो सकता है। X86 विधानसभा में, हम इसे इस रूप में देख सकते हैं

 mov A, 0 mov ecx, A call a__fun 

चूंकि a__fun को कोई उदाहरण डेटा की आवश्यकता नहीं है, भले ही यह इस सूचक को रिक्त प्राप्त करता है, कुछ भी नहीं होगा।

फिर भी shitty कोड और कोई भी संकलक चीख देगा, लेकिन यह चल सकता है।

अधिकांश आधुनिक कंप्यूटरों पर सबसे अधिक व्यवहार, यह है कि वह चलाएगा, और "मज़ा" प्रिंट करेगा, क्योंकि:

  • C ++ फ़ंक्शन को कॉल करने से पहले पॉइंटर नल है या नहीं जांचता है
  • fun() आभासी नहीं है, इसलिए fun() कॉल करने के लिए किसी वीटेल का संदर्भ देने की कोई आवश्यकता नहीं fun()
  • fun() A में किसी भी सदस्य चर का उपयोग नहीं करते हैं, इसलिए इसे this सूचक को रिक्त करने की आवश्यकता नहीं है।

हम नहीं जानते कि क्या होगा सब कुछ हो सकता है, क्योंकि कार्यक्रम अपरिभाषित व्यवहार को प्रदर्शित करता है। क्या एक नल आवेश के कारण किसी सदस्य फ़ंक्शन को लागू करने के कारण अपरिभाषित व्यवहार होता है? ।

मैंने कई बार कोशिश की है, हर समय आउटपुट "मज़ेदार" आ रहा है क्योंकि फ़ंक्शन fun a उदाहरण से स्वतंत्र है I जबकि a->fun(); फोन करना a->fun(); 0 से a अंक तो यह अनिर्धारित व्यवहार है, लेकिन ज्यादातर कंपलर में कोई क्रैश नहीं होना चाहिए।