सी ++ मानक (आईएसओ/आईईसी 14882: 2003 (ई)) से हटा दें §12.5.4, operator delete
अधिक भार के बारे में:ओवरलोडिंग ऑपरेटर एक आधार वर्ग
हटाएं अभिव्यक्ति एक एकल से शुरू होता है :: ऑपरेटर, डीलोकेशन फ़ंक्शन का नाम वैश्विक दायरे में देखा जाता है। अन्यथा, यदि डिलीवरी-अभिव्यक्ति का उपयोग किसी क्लास ऑब्जेक्ट को डिलीकेट करने के लिए किया जाता है जिसका स्थिर प्रकार वर्चुअल विनाशक होता है, तो डेलोकेशन फ़ंक्शन गतिशील प्रकार के आभासी विनाशक (12.4) की परिभाषा में लुकअप द्वारा पाया जाता है। अन्यथा, यदि हटाई-अभिव्यक्ति का उपयोग वर्ग टी या सरणी के किसी ऑब्जेक्ट को डिलीकेट करने के लिए किया जाता है, तो वस्तु के स्थिर और गतिशील प्रकार समान होंगे और डीलोकेशन फ़ंक्शन का नाम टी के दायरे में देखा जाएगा। यदि यह लुकअप विफल रहता है नाम खोजने के लिए, नाम वैश्विक दायरे में देखा गया है। यदि लुकअप का परिणाम संदिग्ध या पहुंच योग्य नहीं है, या यदि लुकअप प्लेसमेंट डेलोकेशन फ़ंक्शन का चयन करता है, तो प्रोग्राम खराब बना हुआ है।
§12.5.7 भी दिलचस्प है:
के बाद से सदस्य आवंटन और आवंटन रद्द करने कार्यों स्थिर हैं वे आभासी नहीं हो सकता। [नोट: हालांकि, जब एक डिलीट-एक्सप्रेशन की कास्ट-एक्सप्रेशन क्लास प्रकार की ऑब्जेक्ट को संदर्भित करती है, क्योंकि वास्तव में डेलोकेशन फ़ंक्शन को कक्षा के दायरे में देखा जाता है जो ऑब्जेक्ट का गतिशील प्रकार होता है, यदि विनाशक आभासी है, प्रभाव वही है। उदाहरण के लिए,
struct B {
virtual ˜B();
void operator delete(void*, size_t);
};
struct D : B {
void operator delete(void*);
};
void f()
{
B* bp = new D;
delete bp; // uses D::operator delete(void*)
}
यहाँ, वर्ग डी की गैर सरणी वस्तु के लिए भंडारण D से पुनः आवंटित की जाती है :: ऑपरेटर आभासी नाशक की वजह से हटाना(),।]
इसे पढ़ने के बाद, मैं सोच रहा हूं ...
- क्या मानक का यह हिस्सा पूरी तरह से सभी प्रमुख सी ++ कंपाइलर्स (एमएसवीसी ++, जीसीसी) द्वारा समर्थित है?
- यदि हां, तो उन्होंने यह कैसे किया? छुपे हुए वर्चुअल फ़ंक्शन? "विशेष" आभासी विनाशक कॉल? RTTI?
- मानक से उदाहरण का उपयोग करना: क्या समस्याएं हो सकती हैं यदि f() और D :: ऑपरेटर डिलीट() को अलग EXE/DLL/DSO में परिभाषित किया गया है? (यह मानते हुए कि सब कुछ जाहिर है, एक ही संकलक का उपयोग कर संकलित किया गया है)
§5.3.5.5 भी प्रासंगिक हो सकता है:
पहले विकल्प (वस्तु हटाना) में, यदि के स्थिर प्रकार ऑपरेंड अपने गतिशील प्रकार से अलग है, स्थिर प्रकार ऑपरेंड के गतिशील प्रकार का आधार वर्ग होगा और स्थैतिक प्रकार में आभासी विनाशक होगा या व्यवहार अपरिभाषित होगा। दूसरे विकल्प में (सरणी हटाएं) यदि ऑब्जेक्ट का डायनामिक प्रकार हटाया जाना चाहिए तो इसके स्थिर प्रकार से भिन्न होता है, व्यवहार अपरिभाषित होता है।
मेरा अनुमान है: वे वर्चुअल टेबल पर चलते हैं। जैसा कि मानक कहता है, कक्षा को सही तरीके से काम करने के लिए एक आभासी विनाशक होना चाहिए। यह 'हटाएं' के गैर-अधिभारित संस्करण के लिए भी सच है। – Xeo
मैंने जवाब देने का प्रयास किया लेकिन ऐसा लगता है कि आप वास्तव में जीसीसी स्रोत कोड में देखने और आपको वापस रिपोर्ट करने के लिए चाहते हैं। मुझे लगता है कि आप इसे स्वयं कर सकते हैं। – littleadv