2009-08-22 11 views
12

मेरे पास बेस क्लास ए है और एक व्युत्पन्न कक्षा बी है:मेरा विनाशक कभी क्यों नहीं बुलाया जाता है?

class A 
{ 
public: 
    virtual f(); 
}; 

class B : public A 
{ 
public: 
    B() 
    { 
     p = new char [100]; 
    } 
    ~B() 
    { 
     delete [] p; 
    } 
    f(); 
private: 
    char *p; 
}; 

किसी भी कारण से विनाशक को कभी नहीं कहा जाता है - क्यों? मैं इसे समझ नहीं पा रहा हूं।

+1

हालांकि सभी को पहले से ही पता चला है कि समस्या क्या है (जैसा कि यह सी ++ में एक एफएक्यू है), मुझे अभी भी सुझाव है कि आपको कक्षा बी का उपयोग करने के तरीके को कोड दिखाना चाहिए (यदि आप इसे इस तरह उपयोग करते हैं: बी * पी = नया बी(); पी को हटाएं; और विनाशक कभी नहीं बुलाया जाता है, तो यह पूरी तरह से अलग समस्या होनी चाहिए।) –

उत्तर

35

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

वर्ग ए में जोड़े

virtual ~A() {}; 

+0

पर पॉइंटर के माध्यम से बुलाया जाता है तो इस वर्चुअल विनाशक का उपयोग करने का कोई कारण नहीं है मुख्य वर्ग में? – sluki

7

कक्षा ए में आभासी विनाशक होना चाहिए। इसके बिना, क्लास विनाशकों को प्राप्त नहीं किया जाएगा।

+2

अगर यूएफ को अवरोधक को ए –

3

इस प्रयास करें:

class A 
{ 
public: 
    virtual ~A() {} 
    virtual f(); 
}; 

class B : public A 
{ 
public: 
    B() 
    { 
     p = new char [100]; 
    } 
    virtual ~B() // virtual keywork optional but occasionally helpful for self documentation. 
    { 
     delete [] p; 
    } 
    f(); 
private: 
    char *p; 
}; 
3

अपने चर ग्रुप ए का है, तो यह एक आभासी नाशक नहीं है और इसलिए यह जीत लिया ' ऑब्जेक्ट के वास्तविक रनटाइम प्रकार को देखने के लिए यह निर्धारित करने के लिए कि इसे desstructor

ए को कॉल करने की आवश्यकता है एक

आभासी ~ एक() {}

को एक खाली नाशक dd और कहा कि इसे ठीक करना चाहिए।

आम तौर पर आपको इसे किसी भी वर्ग पर करने की आवश्यकता होती है जिसे संभवतः बेस क्लास के रूप में उपयोग किया जा सकता है।

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

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