निम्न कोड में, जब ptr
हटा दी जाती है कहा जाता है नहीं है, Base
के लिए नाशक कहा जाता है, लेकिन Derived
के लिए (के Base
आभासी नहीं किया जा रहा नाशक के कारण) नाशक नहीं।विनाश जब नाशक
class Base
{
int b;
};
class Derived : public Base
{
int d;
};
int main(void)
{
Base * ptr = new Derived();
delete ptr;
return 0;
}
वेलग्रिंड की रिपोर्ट है कि कार्यक्रम कोई स्मृति लीक, जो मैं लगता है कि इस अर्थ में कि सब newed डेटा इस विशेष मामले में हटा दिया जाता है में सच है शामिल हैं। मेरा सवाल यह है कि - Derived
के (डिफ़ॉल्ट) विनाशक को नहीं कहा जाता है, d
की स्मृति कब और कैसे याद की जाती है?
मेरा मानना है कि स्मृति को 'हटाएं पीटीआर' के कारण पुनः प्राप्त किया गया है, यह केवल इतना है कि विनाशक का आह्वान नहीं किया जाता है, जो एक * संभावित * अपरिभाषित व्यवहार हो सकता है। – iammilind
यह संभावित नहीं है। यह अपरिभाषित व्यवहार है। (§5.3।5/3) –
आपका वालग्रींड कॉल कहता है "कोई मेमोरी लीक नहीं", मेरा 'मेमोरी लॉगर' कहता है '0x3b2380 पर 8 बाइट आवंटित; 0x3b2380 पर 4 बाइट्स को हटा दिया गया; त्रुटि: 4 बाइट अभी भी आवंटित! '। यूबी। संभावित रूप से यह भी कह सकता है कि 'एक अच्छा दिन सर है'। – Zeta