2012-01-07 16 views
7

के सूचक के माध्यम से एक व्युत्पन्न वस्तु को हटाया जा रहा मैं दो वर्गों, base_class और derived_class और निम्नलिखित कोड है:इसके आधार वर्ग

base_class *ptr = new derived_class; 
delete ptr; 

इस कोड को एक स्मृति रिसाव का उत्पादन होगा? यदि हां, तो मुझे इससे कैसे निपटना चाहिए?

+1

कोड संकलन नहीं होंगे। मैं इसे पहले एक कंपाइलर के माध्यम से गुजरने की सिफारिश करता हूं। बेहतर होगा: 'base_class * ptr = new derived_class();' –

+3

यदि 'base_class' में वर्चुअल विनाशक नहीं है तो यह अपरिभाषित व्यवहार (§5.3.5/p3) –

उत्तर

21

यह आपके द्वारा हटाए जा रहे ऑब्जेक्ट को रिसाव नहीं करेगा, इसकी मेमोरी ब्लॉक मुक्त हो जाएगी।

आप घोषित नहीं किया है base_class में नाशक आभासी तो यह किसी भी गतिशील रूप से आवंटित derived_class कि derived_class का नाशक पर भरोसा करते हैं के भीतर निहित वस्तुओं का रिसाव हो जाएगा होने के लिए उन्हें मुक्त करने के लिए बुलाया जा रहा है। ऐसा इसलिए है क्योंकि यदि विनाशक वर्चुअल नहीं है, तो इस मामले में derived_class विनाशक नहीं कहा जाता है। इसका अर्थ यह भी है कि derived_class के भीतर "एम्बेडेड ऑब्जेक्ट्स" के विनाशकों को स्वचालित रूप से एक अलग लेकिन अतिरिक्त समस्या नहीं कहा जाएगा, जिससे आगे की लीक और महत्वपूर्ण सफाई कोड का निष्पादन हो सकता है।

संक्षेप में, वर्चुअल होने के लिए base_class में विनाशक घोषित करें और आप जो तकनीक प्रस्तुत की है उसका सुरक्षित रूप से उपयोग कर सकते हैं।

एक कोडित उदाहरण के लिए, देखें:

In what kind of situation, c++ destructor will not be called?

+0

ट्रिगर करेगा, धन्यवाद, यह मेरी चिंताओं का उत्तर देता है –

संबंधित मुद्दे