MSVC9.0 रनों के साथ संकलित निम्नलिखित कोड और आउटपुट लॉजिकल है।ऑब्जेक्ट ओरिएंटेड आत्महत्या या इसे हटाएं;
#include <iostream>
class SomeClass
{
public:
void CommitSuicide()
{
delete this;
}
void Reincarnate()
{
this->~SomeClass();
new (this) SomeClass;
}
~SomeClass()
{
std::cout << "Destructor\n";
}
};
int main()
{
SomeClass* p = new SomeClass;
p->CommitSuicide();
p = new SomeClass;
p->Reincarnate();
p->~SomeClass(); //line 5
p->CommitSuicide();
}
मुझे लगता है कि पहले 4 मुख्य में कोड की लाइनों अपरिभाषित व्यवहार में परिणाम नहीं है (हालांकि पूरी तरह delete this;
बात के बारे में निश्चित नहीं)। मैं पुष्टिकरण के एंटोनिम> के लिए पुष्टिकरण या < प्लेसहोल्डर रखना चाहता हूं। लेकिन मुझे लाइन 5 और 6 के बारे में गंभीर संदेह है। इसे विनाशक को स्पष्ट रूप से कॉल करने की अनुमति है, है ना? लेकिन क्या उस वस्तु का जीवनकाल उसके बाद खत्म हो गया है? अर्थात, विनाशक (परिभाषित) की स्पष्ट कॉल के बाद किसी अन्य सदस्य का आदान-प्रदान है?
संक्षेप में, उपर्युक्त कोड (यदि कोई है) के कौन से हिस्सों में अपरिभाषित व्यवहार (तकनीकी रूप से बोलने) का परिणाम है?
लेकिन निर्माता को केवल 3 बार कहा जाता है, तो विनाशक को 4 बार तार्किक कैसे कहा जाता है? जैसे ही कक्षा (गैर-तुच्छ) डेटा सदस्यों को मिलती है, यह बम होगा। – visitor
<पुष्टिकरण के एंटोनिम के लिए प्लेसहोल्डर> - इसे "अस्वीकार" कहा जाता है – slashmais