बेस पॉइंटर के माध्यम से व्युत्पन्न वस्तुओं की एक सरणी को हटाना अपरिभाषित क्यों हो सकता है
सी में, एक सरणी को हटाने का व्यवहार अपरिभाषित है यदि वस्तु का गतिशील प्रकार उसके स्थिर प्रकार से भिन्न होता है। इसे C 03 मानक (5.3.5 [expr.delete] p3) में उल्लिखित किया गया है: "दूसरे विकल्प (डिलीट ऐरे) में, यदि हटाए जाने वाले ऑब्जेक्ट का गतिशील प्रकार उसके स्थिर प्रकार से भिन्न है, तो व्यवहार अपरिभाषित है ।"
स्पष्टीकरण के लिए, निम्नलिखित कोड स्निपेट पर विचार करें:
struct B { virtual ~B() {} };
struct D : B {};
B* p = new D[20];
delete[] p; // undefined behavior
हालांकि बेस पॉइंटर का उपयोग करके व्युत्पन्न वस्तुओं की एक श्रृंखला को हटाना सहज लग सकता है, मानक इसे अपरिभाषित व्यवहार के रूप में निर्दिष्ट करता है। इसका कारण यह है कि आधार सूचक p, पहले तत्व के बजाय, सरणी में पहले तत्व के आधार उप-वस्तु को इंगित करता है।
सरणी के बहुरूपी विलोपन को लागू करने के लिए तत्व प्रकार को पुनः प्राप्त करने, एक गतिशील कास्ट करने की आवश्यकता होगी, और फिर एक सादा डिलीट निष्पादित करना[]। हालाँकि, जब बहुरूपता का उपयोग नहीं किया जाता है तब भी इसमें अनावश्यक ओवरहेड खर्च होगा।
इसलिए, अपरिभाषित व्यवहार और अनावश्यक ओवरहेड से बचने के लिए, यह याद रखना महत्वपूर्ण है कि सरणियाँ बहुरूपता से व्यवहार नहीं कर सकती हैं। इसके बजाय, यदि बहुरूपी व्यवहार वांछित है, तो इसे अलग से लागू किया जा सकता है। यदि आवश्यक हो तो सरणियों का बहुरूपी विलोपन अलग से लागू किया जा सकता है।
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3