2012-03-31 16 views
8

क्या सी ++ कक्षाओं में डिफ़ॉल्ट विनाशक स्वचालित रूप से उन सदस्यों को हटा देता है जिन्हें स्पष्ट रूप से कोड में आवंटित नहीं किया जाता है? उदाहरण के लिए:डिफ़ॉल्ट विनाशक कितना करता है

class C { 
    public: 
    C() {} 
    int arr[100]; 
}; 

int main(void) { 
    C* myC = new C(); 
    delete myC; 
    return 0; 
} 

MYC पुनःआवंटन MYC के स्वचालित रूप से आगमन को नष्ट करता है? या क्या मुझे स्पष्ट रूप से ऐसा करने के लिए सी के विनाशक को लिखने की ज़रूरत है?

+2

http://www.parashift.com/c++-faq-lite/dtors.html – Anycorn

+0

यह स्वचालित रूप से सरणी को हटा देता है। – JosephH

उत्तर

5

निर्माता (किसी भी सीटीओआर-प्रारंभकर्ता-सूची की अनुपस्थिति में) प्रत्येक सबोबजेक्ट के लिए डिफ़ॉल्ट कन्स्ट्रक्टर को कॉल करता है।

चूंकि आपके पास कोई आधार वर्ग नहीं है और आपके सदस्य चर प्राचीन प्रकार हैं, यह कुछ भी नहीं करेगा।

विनाशक के साथ ही। आपका निस्संदेह संकलक-जेनरेट किया गया है क्योंकि आपने एक घोषित नहीं किया है, और यह प्रत्येक सबोबजेक्ट के लिए विनाशक को कॉल करेगा। फिर यह छोटा है क्योंकि आपका एकमात्र उपनिवेश प्राइमेटिव्स का कुल है।

अब, जब आप इसे हटाते हैं तो कक्षा की सभी यादों को मुक्त कर दिया जाएगा। चूंकि सरणी कक्षा के अंदर एम्बेडेड है, यह एक ही स्मृति क्षेत्र का हिस्सा है और एक ही समय में मुक्त हो जाएगी।

+0

@ मार्क: विनाशकों के लिए कोई "डिफ़ॉल्ट" भेद नहीं है, क्योंकि उन्हें ओवरलोड नहीं किया जा सकता है। –

+0

@ मार्क: कोई समस्या नहीं। –

+0

"subobject" से आपका मतलब "डेटा सदस्य" है, निश्चित रूप से? –

5

निहित परिभाषित (डिफ़ॉल्ट) विनाशक प्रत्येक सदस्य के लिए विनाशक को बुलाएगा। सदस्य सरणी के मामले में, यह सरणी के प्रत्येक तत्व के लिए विनाशक को कॉल करेगा।

ध्यान दें कि पॉइंटर्स में विनाशक नहीं हैं; आपको उन्हें मैन्युअल रूप से हटाने की आवश्यकता है। आपके पास प्रदत्त उदाहरण में यह समस्या नहीं है, लेकिन इसके बारे में जागरूक होना कुछ है।

+1

प्वाइंटर्स के पास विनाशक हैं [(यहां देखें)] (http://ideone.com/97iUx), हालांकि जाहिर है कि वे जो भी इंगित करते हैं उन्हें हटा नहीं देते हैं। – Pubby

+0

प्रतीक्षा करें ... आप कहते हैं कि पॉइंटर्स के पास विनाशक नहीं हैं, लेकिन मैंने सोचा कि डिलीट केवल पॉइंटर लेता है। आप कह रहे हैं कि डिफ़ॉल्ट विनाशक सरणी में हर 100 चींटियों पर हटाएगा? – Robz

+0

@ रोबज़, नहीं - मैं कह रहा हूं कि निहित विनाशक * कॉल नहीं करता है, अगर आपको सदस्यों के रूप में कोई कच्चा पॉइंटर्स है तो आपको खुद को एक स्पष्ट विनाशक में करना होगा। –

5

यदि आपकी कक्षा/संरचना में एक सूचक होता है, और आप स्पष्ट रूप से उस पॉइंटर के लिए कुछ आवंटित करते हैं, तो आपको आमतौर पर dtor में मिलान delete लिखना होगा। सदस्य जो कक्षा/संरचना में सीधे एम्बेडेड होते हैं उन्हें स्वचालित रूप से बनाया और नष्ट कर दिया जाएगा।

class X { 
    int x; 
    int *y; 
public: 
    X() : y(new int) {} 
    ~X() : { delete y; }  
}; 

यहां एक्स :: एक्स स्वचालित रूप से बनाया/नष्ट हो जाएगा। एक्स :: वाई (या, तकनीकी रूप से सही होने के लिए, एक्स :: वाई अंक क्या है) नहीं - हम इसे ctor में आवंटित करते हैं और इसे dtor में नष्ट कर देते हैं।

+0

'एक्स :: वाई' स्वचालित रूप से नष्ट हो गया है। यह' * (एक्स :: वाई) 'है जो कि अगर यह विनाशक के लिए नहीं था तो रिसाव होगा। (और आपका नमूना नियम-तीन-चार/पांच टूटता है) –

+0

@BenVoigt: हां - सवाल यह था कि विनाशक क्या करता है, रिमोट स्वामित्व को सही ढंग से संभालने वाली कक्षा को कैसे लिखना है। –

0

जो भी आप नए कॉल करते हैं, उसके पास एक समान डिलीट होना चाहिए। अगर आपने कुछ उदाहरण बनाने के लिए नया फोन नहीं किया है तो आपको डिलीट कॉल करने की आवश्यकता नहीं है।

+0

IMHO, आपको शायद ही कभी एप्लिकेशन-कोड में कुछ भी हटाएं। इसके बजाय, सख्त स्वामित्व स्थापित करने का प्रयास करें या सभी सदस्यों के लिए अर्थशास्त्र के सदस्य, जैसे कि स्वचालित विनाश करता है चाल। अगर यह असफल हो, तो स्मार्ट पॉइंटर्स अक्सर मैन्युअल पॉइंटर्स और 'हटाएं' के लिए बेहतर विकल्प होते हैं। – Rawler

-1

आपको विनाशक को लिखने की आवश्यकता नहीं है। स्मृति को रीसायकल करने के लिए 'वापसी 0' के बाद ऑब्जेक्ट को हटाने के लिए C++ क्लास में डिफ़ॉल्ट विनाशक है।

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