2012-02-28 9 views
12

कहलाता है मेरा प्रश्न सरल है, लेकिन मैं कहीं भी प्रश्न नहीं ढूंढ पाया।क्या विनाशक स्वचालित रूप से

अगर मैं इस तरह के

class A { 
    vector<int> data; 
} 

A का एक उदाहरण नष्ट हो जाता है जब data भी ठीक से नष्ट हो जाएगा की तरह एक वर्ग है, या मैं A कि कॉल data के नाशक के लिए एक नाशक लिखना चाहिए? असल में मैं इस बारे में चिंतित हूं कि A का उदाहरण नष्ट होने पर वेक्टर की गतिशील स्मृति को मुक्त नहीं किया जाएगा। मुझे संदेह है कि जवाब यह है कि data ठीक से मुक्त हो गया है, लेकिन मैं नहीं जानना चाहता कि मैं गलत तरीके से गलत हूं।

आगे, यदि A एक संरचना थी तो data के विनाशक को कॉल किया जाएगा जब A का स्थानीय उदाहरण गुंजाइश से बाहर हो जाता है?

+2

'कक्षा ए' की घोषणा के बाद आप अर्ध-कॉलन की कमी कर रहे हैं (जो वास्तव में इसकी कमी के बाद से घोषणा नहीं है ... ओह ठीक है)। –

उत्तर

14

हां, data स्वचालित रूप से नष्ट हो जाएगा, आपको इसे प्राप्त करने के लिए कुछ भी करने की आवश्यकता नहीं है। vector इसके द्वारा आवंटित गतिशील स्मृति की सफाई को संभालेगा। A का एक उदाहरण नष्ट होने पर वेक्टर के विनाशक को स्वचालित रूप से बुलाया जाएगा।

Aclass या struct है या नहीं, भले ही व्यवहार में कोई अंतर नहीं है।

+14

+1 बस स्पष्ट होने के लिए, "वेक्टर आवंटित गतिशील स्मृति की सफाई * इसे * * * * * से नहीं करेगा। यदि आप एक वेक्टर में गतिशील रूप से आवंटित वस्तुओं को संग्रहीत करते हैं, तो तदनुसार उन्हें हटाने के लिए आपकी ज़िम्मेदारी है। – netcoder

+0

@netcoder आपकी टिप्पणी को थोड़ा भ्रामक लगता है। आप एक वेक्टर ** पॉइंटर्स में गतिशील रूप से आवंटित ऑब्जेक्ट्स में स्टोर कर सकते हैं ** लेकिन मुझे नहीं लगता कि आप "ऑब्जेक्ट्स" को स्वयं स्टोर कर सकते हैं जो वेक्टर में गतिशील रूप से आवंटित होते हैं। यदि आप एक वेक्टर घोषित करते हैं जहां कक्षा ए कक्षा का नाम है, तो वेक्टर क्लास ऑब्जेक्ट्स के विनाश का ख्याल रखेगा।बेशक, यदि आपकी कक्षा ए ऑब्जेक्ट्स अन्य ऑब्जेक्ट्स के पॉइंटर्स धारण करती है, तो यह ** ** उन्हें हटाने के लिए क्लास की ज़िम्मेदारी ** ** ** वेक्टर ** की ज़िम्मेदारी नहीं है, लेकिन यह एक और कहानी है। अच्छे RAII सिद्धांतों का पालन करने के लिए –

2

कोई ज़रूरत नहीं, डेटा सदस्य के विनाशकों को हमेशा बुलाया जाता है।

एक स्पष्ट नाशक उपयोगी स्मृति प्रबंधन को है

struct a{ 
    int* ip; 
    a() 
    : ip(new int(5)) 
    { } 

    ~a() { delete ip; } 
}; 

कहा कि, आप आम तौर पर (जैसे स्मार्ट संकेत के रूप में) का उपयोग करें आरए II कंटेनर बोल चाहिए ताकि मैं व्यक्तिगत रूप से शायद ही कभी वहाँ dtors दिनों लिखें।

और इसके लिए अपवाद वर्चुअल के रूप में बेस क्लास dtor घोषित करना है।

struct base { 
    virtual ~base() {} 
}; 
struct child : public base { 
    //base and child destructor automatically called 
} 
+0

+1। मैन्युअल रूप से विनाशकों को लिखने की आवश्यकता कम हो रही है जब लोग सी ++ कोडिंग कर रहे हैं जिस तरह से स्ट्राउस्ट्रप, सटर, मेयर्स और अन्य आधुनिक सी ++ विचारक हमें लिखने का इरादा रखते हैं। – stinky472

1

यदि आप स्वयं को परिभाषित नहीं करते हैं तो एक डिफ़ॉल्ट-विनाशक संकलक द्वारा स्वचालित रूप से बनाया जाता है। आम तौर पर, आपको अपने स्वयं के विनाशक को बनाने की आवश्यकता नहीं होती है जब तक आपके पास पॉइंटर डेटा-सदस्य नहीं होते हैं जो वे "स्मृति" को इंगित करते हैं, और/या आप अपनी कक्षा को अन्य वर्गों द्वारा प्राप्त करने के लिए डिज़ाइन कर रहे हैं, जिस बिंदु पर आप चाहते हैं कम से कम virtual विनाशक घोषित करने के लिए।

सभी मामलों में, दोनों अपने स्वयं के विनाशक के साथ-साथ डिफ़ॉल्ट कंपाइलर-निर्मित विनाशक के साथ, गैर-स्थैतिक डेटा-सदस्यों के साथ-साथ वर्तमान वर्ग के किसी भी बेस-क्लास के लिए सभी विनाशकों को अंत में बुलाया जाता है विनाशक और विनाशक कार्य स्वयं ही लौटता है।

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

  • कोई संबंधित समस्या नहीं^_^