2012-09-30 38 views
6

देखो:सी ++ std :: सूची :: स्पष्ट() विनाशकों को क्यों नहीं बुला रहा है? इस कोड में

class test 
{ 
    public: 
     test() { cout << "Constructor" << endl; }; 
     virtual ~test() { cout << "Destructor" << endl; }; 
}; 

int main(int argc, char* argv[]) 
{ 
    test* t = new test(); 
    delete(t); 
    list<test*> l; 
    l.push_back(DNEW test()); 
    cout << l.size() << endl; 
    l.clear(); 
    cout << l.size() << endl; 
} 

और फिर, इस उत्पादन को देखो:

Constructor 
    Destructor 
    Contructor 
    1 
    0 

सवाल यह है: क्यों l.clear() को नहीं बुलाया सूची तत्व की नाशक है?

उत्तर

12

आपकी सूची पॉइंटर्स की है। पॉइंटर्स में विनाशक नहीं होते हैं। यदि आप विनाशक को बुलाया जाना चाहते हैं तो आपको इसके बजाय list<test> आज़माएं।

+0

अच्छा, मैंने यही सोचा लेकिन मैं इसकी पुष्टि करना चाहता था। – danikaze

+0

या Boost.PointerContainer का ['ptr_list'] (http://www.boost.org/doc/libs/release/libs/ptr_container/doc/ptr_list.html) का उपयोग करें। –

+1

हाँ, मैं ज्यादातर चीजों के लिए स्मार्टपॉइंटर्स का उपयोग करता हूं लेकिन कभी-कभी कच्चे पॉइंटर्स बेहतर होते हैं। बात यह है कि मैंने सोचा कि अगर मेरे पास पॉइंटर पी है, तो हटाएं (पी) कहा जाता था ... लेकिन अब यह जानना ठीक है। मैं कच्चे पॉइंटर्स मुक्त कर दूंगा। – danikaze

3

delete का उपयोग कर पॉइंटर्स को मुक्त करने का एक बेहतर विकल्प, या उस चीज़ का उपयोग करके जो इसे दूर करता है (जैसे कि स्मार्ट पॉइंटर्स या पॉइंटर कंटेनर), सीधे स्टैक पर ऑब्जेक्ट्स बनाना है।

आपको test * t = new test(); से अधिक पसंद करना चाहिए, आप शायद ही कभी किसी भी पॉइंटर से निपटना चाहते हैं जो संसाधन, स्मार्ट या अन्यथा है।

यदि आप तत्वों के पॉइंटर्स की बजाय 'असली' तत्वों के std::list का उपयोग करना चाहते थे, तो आपको यह समस्या नहीं होगी।