यह आपके द्वारा हटाए जा रहे ऑब्जेक्ट को रिसाव नहीं करेगा, इसकी मेमोरी ब्लॉक मुक्त हो जाएगी।
आप घोषित नहीं किया है base_class
में नाशक आभासी तो यह किसी भी गतिशील रूप से आवंटित derived_class
कि derived_class
का नाशक पर भरोसा करते हैं के भीतर निहित वस्तुओं का रिसाव हो जाएगा होने के लिए उन्हें मुक्त करने के लिए बुलाया जा रहा है। ऐसा इसलिए है क्योंकि यदि विनाशक वर्चुअल नहीं है, तो इस मामले में derived_class
विनाशक नहीं कहा जाता है। इसका अर्थ यह भी है कि derived_class
के भीतर "एम्बेडेड ऑब्जेक्ट्स" के विनाशकों को स्वचालित रूप से एक अलग लेकिन अतिरिक्त समस्या नहीं कहा जाएगा, जिससे आगे की लीक और महत्वपूर्ण सफाई कोड का निष्पादन हो सकता है।
संक्षेप में, वर्चुअल होने के लिए base_class
में विनाशक घोषित करें और आप जो तकनीक प्रस्तुत की है उसका सुरक्षित रूप से उपयोग कर सकते हैं।
एक कोडित उदाहरण के लिए, देखें:
In what kind of situation, c++ destructor will not be called?
कोड संकलन नहीं होंगे। मैं इसे पहले एक कंपाइलर के माध्यम से गुजरने की सिफारिश करता हूं। बेहतर होगा: 'base_class * ptr = new derived_class();' –
यदि 'base_class' में वर्चुअल विनाशक नहीं है तो यह अपरिभाषित व्यवहार (§5.3.5/p3) –