दिलचस्प पोस्ट
सरणी स्थिरांक केवल प्रारंभिक रूप में क्यों उपयोग किए जा सकते हैं? जावा रिएन्ट्रंटरेडड्राइटलेक्स – कैसे सुरक्षित रूप से लॉक लॉक प्राप्त करें? क्या मॉड्यूल के गुणों में उसी तरह की चीजें हैं जो ऑब्जेक्ट कर सकते हैं? MySQL – REGEXP क्वेरी में मिलान पैटर्न लौटें WordPress रूट निर्देशिका पथ पुनर्प्राप्त करें? Jquery – मक्खी पर छुपा फार्म तत्व बनाएँ मोंगोडीबी से रैंडम रिकॉर्ड मैं कैमरा पूर्वावलोकन कैसे हेरफेर कर सकता हूं? वास्तव में "यू" क्या करता है? "Git push -u मूल मास्टर" बनाम "git push origin master" जावा खोया संबंध का पता लगाता है मैं दो बाइट क्यों नहीं जोड़ सकता और एक इंट प्राप्त नहीं कर सकता और मैं दो अंतिम बाइट्स को बाइट प्राप्त कर सकता हूँ? LINQ: फ़िल्टरिंग मापदंड के साथ एकल ऑर डिफॉल्ट बनाम फर्स्टऑरफॉल्ट () का उपयोग कब किया जाए क्रोम में गलत MIME प्रकार के साथ फ़ॉन्ट-चेहरे सी ++ पढ़ता है और एक परमाणु का लेखन करता है? बीच में रिक्त स्थान सहित VBA में प्रयुक्त अंतिम पंक्ति का निर्धारण कैसे करें

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

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

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 अंक तो यह अनिर्धारित व्यवहार है, लेकिन ज्यादातर कंपलर में कोई क्रैश नहीं होना चाहिए।