2013-06-27 13 views
8

मैं एक टेम्पलेट वर्ग लिख रहा हूं जो आंतरिक रूप से दिए गए प्रकार की सरणी का प्रबंधन करता है। इस तरह:हटाता है [] कॉल विनाशक?

template<typename T> 
class Example { 
    // ... 
private: 
    T* objects; // allocated in c'tor (array), deleted in d'tor 
    // ... 
}; 

मैं अगर सी ++ objects में प्रत्येक वस्तु के नाशक कॉल जब मैं यह delete[] objects; के माध्यम से हटाना सोच रहा था।

मुझे यह जानने की ज़रूरत है, क्योंकि मेरी कक्षा में वस्तुओं में हर समय समझदार मूल्य नहीं होते हैं, इसलिए विनाशकों को तब नहीं कहा जाना चाहिए जब वे नहीं करते हैं।

इसके अतिरिक्त, अगर मैं Example<T> के हिस्से के रूप में T objects[100] जैसे निश्चित आकार के सरणी घोषित करता हूं तो मैं जानना चाहूंगा कि विनाशकों को बुलाया जाएगा या नहीं।

+14

"क्योंकि मेरी कक्षा में वस्तुओं में हर समय समझदार मूल्य नहीं होते हैं" यह वर्ग टूटा हुआ लगता है। –

+0

कक्षा एक संग्रह है जो समय से पहले स्मृति आवंटित करता है, जिसका उपयोग हमेशा नहीं किया जाता है। मुझे उस स्थान को NULL के साथ भरने की आवश्यकता नहीं है क्योंकि कक्षा पहले ही जानता है कि कौन से तत्व उपयोग में हैं और जो नहीं हैं। – Mixthos

+0

यदि 'नया []' कन्स्ट्रक्टर कॉल करता है तो यह विनाशकों को कॉल करने के लिए 'हटाएं []' के लिए केवल तार्किक है। यह केवल तार्किक है। – dtech

उत्तर

18

यदि T में एक विनाशक है तो इसे delete[] द्वारा बुलाया जाएगा। अनुभाग 5.3.5 से हटाएँ C++ 11 मानक के (मसौदा n3337), खंड 6:

तो नष्ट-अभिव्यक्ति की संकार्य के मूल्य में एक अशक्त सूचक मूल्य नहीं है, हटाना -प्रदर्शन ऑब्जेक्ट के लिए विनाशक (यदि कोई है) या सरणी के तत्व हटाए जा रहे हैं। सरणी के मामले में, तत्व कम करने के क्रम में नष्ट हो जाएंगे (यानी, उनके निर्माता के को पूरा करने के विपरीत क्रम में; 12.6.2 देखें)।

एक प्रकार T के लिए नाशक भी T[] की एक सरणी में प्रत्येक तत्व के लिए लागू किया जाएगा जब सरणी गतिशील रूप से आवंटित नहीं किया गया है और सरणी गुंजाइश (जीवन समाप्त होता है) से बाहर चला जाता है।


मैं क्योंकि मेरी कक्षा में वस्तुओं समझदार मूल्यों हर समय शामिल नहीं है, यह जानने की जरूरत है, तो विनाशकर्ता नहीं कहा जाना चाहिए जब वे नहीं है।

लेकिन, यहां बहुत एक वस्तु है कि एक राज्य है जहां यह विलुप्त नहीं किया जा सकता प्राप्त कर सकते हैं के साथ महत्वपूर्ण समस्या हो रहा है।

1

delete[] objects को समान (लेकिन समान नहीं) है:

for (i = 0; i < num_of_objects; ++i) { 
    delete objects[i]; 
} 

delete के बाद से नाशक कहता है, आप भी ऐसा ही करने delete[] उम्मीद कर सकते हैं।

3

हां, delete[] का उपयोग करते समय विनाशक को सरणी में सभी ऑब्जेक्ट्स के लिए बुलाया जाएगा। लेकिन यह कोई मुद्दा नहीं होना चाहिए, क्योंकि जब आप new[] (आपने किया था, सही?) का उपयोग करने के लिए कन्स्ट्रक्टर को सरणी में सभी ऑब्जेक्ट्स के लिए बुलाया गया था।

यदि कोई ऐसी वस्तु ऐसी स्थिति में हो सकती है जो विनाशक को बुलाएगी तो अमान्य होगा, तो आपके ऑब्जेक्ट में कुछ गंभीरता से गलत है। आपको सभी मामलों में अपने विनाशक को काम करने की जरूरत है।

1

delete [] सरणी के प्रत्येक तत्व के लिए विनाशक को कॉल करता है। सदस्य सरणी के लिए भी होता है (आपका T objects[100])।

आप "गैर समझदार" मूल्यों से निपटने के लिए अपने टेम्पलेट objects द्वारा की ओर इशारा करने के लिए (, rule of three/five देख सकते हैं और निर्माता प्रतिलिपि बनाएँ, और असाइनमेंट ऑपरेटर कॉपी) सूचक के रूप में रखना, और नाशक डिजाइन करने के लिए चाहते हैं।

2

उत्तर हाँ है। प्रत्येक वस्तु के लिए विनाशक कहा जाता है।

संबंधित नोट पर, आपको जब भी संभव हो delete का उपयोग करने से बचने की कोशिश करनी चाहिए। स्मार्ट पॉइंटर्स का उपयोग करें (उदा।, unique_ptr, shared_ptr) और एसटीएल कंटेनर (उदा।, Std :: vector, std :: array) इसके बजाए।

0

हां, delete[] गारंटी देता है कि हर वस्तु पर विनाशकों को बुलाया जाता है।

Boost pointer containers का उपयोग करके, या केवल स्मार्ट पॉइंटर्स के कंटेनर का उपयोग करके, आपके पॉइंटर्स के संग्रह (अपवाद सुरक्षित) संग्रह को बहुत आसान बना सकता है।

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