मेरी राय में, निम्नलिखित कोड (कुछ सी ++ प्रश्न से) को यूबी का नेतृत्व करना चाहिए, लेकिन ऐसा लगता है कि ऐसा नहीं है। यहाँ कोड है:क्या स्पष्ट रूप से विनाशकारी परिणाम को अपरिभाषित व्यवहार में बुला रहा है?
#include <iostream>
using namespace std;
class some{ public: ~some() { cout<<"some's destructor"<<endl; } };
int main() { some s; s.~some(); }
और जवाब है:
some's destructor
some's destructor
मैं प्रपत्र सीखा C++ फैक लाइट है कि हम स्पष्ट रूप से नाशक नहीं बुलाना चाहिए। मुझे लगता है कि स्पष्ट रूप से विनाशक को बुलाए जाने के बाद, वस्तु को हटा दिया जाना चाहिए। कार्यक्रम समाप्त होने पर स्वचालित रूप से विनाशक को फिर से कॉल करता है, यह यूबी होना चाहिए। हालांकि, मैंने इसे g ++ पर आज़माया, और उपर्युक्त उत्तर के समान परिणाम प्राप्त किया।
क्या ऐसा इसलिए है क्योंकि कक्षा बहुत सरल है (कोई नया/शामिल नहीं है)? या यह इस मामले में यूबी नहीं है?
* अपरिभाषित व्यवहार * का पूरा बिंदु यह है कि यह ** अनिर्धारित ** है। तथ्य यह है कि यह "काम करता है" अनंत संभावनाओं में से एक है। – ereOn
यह विनाशक हानि प्रभाव के लिए बहुत आसान है। मेरा मानना है कि विनाशक को बुलाकर एक विशेष मामला नहीं है, बल्कि कक्षा की विधि को बुला रहा है। इसे हटाए जाने से पहले सही कहने का विशेष मामला है (हटाएं या दायरे से बाहर निकलने से)। –
@ereOn: धन्यवाद। मैं समझता हूं कि जी ++ में यह "काम करता है" इसका मतलब यह नहीं है कि यह "अपरिभाषित" नहीं है। हालांकि, ऑनलाइन उत्तर (जो सही नहीं हो सकता है) यूबी नहीं है, इसलिए मैं उलझन में हूं। – EXP0