निम्न उदाहरण पर विचार करें:vtable के लिए विनाशक से सुरक्षित अपवाद फेंक रहा है?
#include <csignal>
class A
{
public:
virtual ~A() {}
virtual void foo() = 0;
};
class B : public A
{
public:
virtual ~B() { throw 5; }
virtual void foo() {}
};
int main(int, char * [])
{
A * b = new B();
try
{
delete b;
}
catch (...)
{
raise(SIGTRAP);
}
return 0;
}
मैं हमेशा सोचा है (अनुभवहीन मुझे) है कि जब कार्यक्रम catch
अनुभाग में, इस मामले में हो जाता है, तो B
वस्तु, जिस पर b
अंक वैसे ही रहेंगे यह काफी है, क्योंकि तार्किक है कि अपवादकर्ता को "रद्द" (अगर सुरक्षित रूप से प्रोग्राम किया गया) विनाशक के प्रभाव होगा। लेकिन जब मैं gdb में इस स्निपेट भागने की कोशिश की और catch
खंड में ब्रेकप्वाइंट को मिला मैंने देखा कि बी वस्तु चला गया था और केवल एक आधार वस्तु छोड़ दिया क्योंकि vtable इस तरह देखा:
(gdb) i vtbl b
vtable for 'A' @ 0x400cf0 (subobject @ 0x603010):
[0]: 0x0
[1]: 0x0
[2]: 0x4008e0 <[email protected]>
मेरा प्रश्न: अगर मैं जुनून से विनाशक से अपवाद फेंकना चाहता हूं तो vtable से बचने के लिए कोई रास्ता है?
विनाशक फेंकने अजीब हैं, यदि संभव हो तो इससे बचें। –
विनाशकों को फेंकना अजीब से भी बदतर है। वे वास्तव में [काफी खतरनाक] हैं (https://isocpp.org/wiki/faq/exceptions#dtors-shouldnt-throw) और लगभग सभी स्थितियों में से बचा जाना चाहिए। – Kevin
आप किसी ऑब्जेक्ट के विनाश को क्यों रोकना चाहते हैं? क्या आप जानते हैं कि एक गुंजाइश का मतलब है, स्थानीय वस्तुओं का विनाश? तो क्या आप चाहते हैं कि कंपाइलर आपकी ऑब्जेक्ट को नष्ट करने से बचने के लिए स्टैक को ऊपर उठाए? क्या आपने कभी देखा है, संसाधनों की सफाई के लिए कार्य, आमतौर पर हमेशा सफल होते हैं - और शून्य वापस आते हैं। –