"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > C++ में बेस पॉइंटर अपरिभाषित व्यवहार के माध्यम से व्युत्पन्न वस्तुओं की एक श्रृंखला को क्यों हटाया जा रहा है?

C++ में बेस पॉइंटर अपरिभाषित व्यवहार के माध्यम से व्युत्पन्न वस्तुओं की एक श्रृंखला को क्यों हटाया जा रहा है?

2024-12-23 को प्रकाशित
ब्राउज़ करें:788

Why is Deleting an Array of Derived Objects via a Base Pointer Undefined Behavior in C  ?

बेस पॉइंटर के माध्यम से व्युत्पन्न वस्तुओं की एक सरणी को हटाना अपरिभाषित क्यों हो सकता है

सी में, एक सरणी को हटाने का व्यवहार अपरिभाषित है यदि वस्तु का गतिशील प्रकार उसके स्थिर प्रकार से भिन्न होता है। इसे 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