2011-05-29 8 views
20

संभव डुप्लिकेट:
STL containers element destruction orderआदेश :: वेक्टर

वहाँ एक गारंटी एक std::vector के तत्वों पहले करने के लिए पिछले से नष्ट हो जाएगा है?

+0

मुझे लगता है कि यह गारंटी निर्भर करता है कि गारंटी कच्चे सरणी पर भी लागू होती है, क्योंकि std :: vector mimic arrays करता है। लेकिन मुझे नहीं पता कि मानक इसके बारे में क्या कहता है। – Klaim

+0

@Klaim: 'std :: vector' केवल 'op []' वाक्यविन्यास के साथ सरणी की नकल करता है; जो कि किसी भी जीवनकाल गारंटी के बारे में कुछ भी नहीं कहता है। –

+0

अच्छी पकड़ @ किरील। –

उत्तर

15

2003: 5.3.5/6 का कहना है के बारे में delete[]:

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

इसलिए यदि आपके std::vector वस्तु की संभाजक delete[] तो का उपयोग करता है, हाँ, यह उलटे क्रम में तत्वों को नष्ट करने के लिए बाध्य है।

हालांकि, इस बात की कोई गारंटी नहीं है कि आपके std::vector इस तरह से काम करेंगे (और, वास्तव में, यह संभवतः नहीं है), और मुझे कंटेनर के लिए विशिष्ट कोई उद्धरण नहीं मिल रहा है।

वास्तव में, मुझे लगता है कि यह आपके आवंटक और 2003 के लिए नीचे है: 20.1.5 (जो आवंटकों पर दी गई आवश्यकताओं को सूचीबद्ध करता है) इसके बारे में कुछ भी नहीं कहता है।

+0

किसी भी विचार पर अगर यह सिर्फ दायरे से बाहर हो जाता है और वेक्टर :: ~ वेक्टर() कहा जाता है? – Jordan

+0

@ योएल: हुह? इससे कोई फर्क नहीं पड़ता कि 'std :: vector' के विनाश का आह्वान कैसे किया जाता है? हम इसके तत्वों के विनाश के बारे में बात कर रहे हैं। –

+4

यह लगभग निश्चित है कि 'std :: vector'' हटाएं [] 'का उपयोग नहीं करेगा, क्योंकि एक उचित कार्यान्वयन अतिरिक्त आवंटित लेकिन अनियमित स्थान चाहता है, जिसके लिए रचनाकार नहीं चलते हैं (और इस प्रकार विनाशकों को नहीं चलना चाहिए)। –

3

वे मानक कच्चे सरणी के लिए इसकी गारंटी देते हैं, लेकिन मुझे ऐसा कुछ भी नहीं मिल रहा है जो इसे कंटेनर के लिए गारंटी देगा।

[expr.delete] से (के लिए C++ 0x नए शब्दों):

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

std::vector (और वास्तव में, मानक पुस्तकालय में सभी कंटेनर, संभवतः std::array को छोड़कर) delete[] का उपयोग नहीं करते हैं (वे allocator_traits<allocator_type>::destroy प्रत्येक तत्व को अलग-अलग पर उपयोग करें), तत्वों को नष्ट करने की तो इसके बाद के संस्करण की गारंटी लागू नहीं होता। और मुझे हटाए जाने के आदेश के बारे में विशेष रूप से std::vector पर या सामान्य रूप से कंटेनर पर कोई प्रतिबंध नहीं मिल सकता है। कुछ कंटेनर के लिए, ऐसी गारंटी बहुत महंगा होगी (उदा। std::forward_list उन्हें हटाने के लिए तत्वों को फिर से नहीं हटा सकता है, और std::map उस क्रम को याद नहीं करता है जिसमें जोड़े जोड़े गए थे)।

[container.requirements.general] से (C++ 0x शब्दों):

घटकों एक एफएफ इस उपखंड है कि एक allocator_type घोषित द्वारा ected के लिए, इन घटकों में संग्रहीत वस्तुओं allocator_traits का प्रयोग कर बनाया किया जाएगा :: समारोह और का निर्माण allocator_traits :: नष्ट कार्य (20.6.8.2) का उपयोग कर नष्ट कर दिया।

3

नहीं, आदेश और उलटे क्रम में नष्ट कर दिया सरणियों, जहां सभी तत्वों निर्माण कर रहे हैं के लिए गारंटी नहीं दी जाती है। यह कुछ हद तक सुसंगत है कि वैश्विक वस्तुओं को कैसे संभाला जाता है।

दूसरी ओर, कंटेनर सदस्यों का निर्माण insert और erase सदस्य कार्यों के लिए किसी भी क्रम में बनाया और नष्ट किया जा सकता है। निर्माण के विपरीत क्रम में तत्वों को कुछ हद तक सुसंगत और नष्ट करने के लिए, इन कंटेनरों को इन परिवर्तनों पर किसी प्रकार का लॉग रखने की आवश्यकता होगी। जाहिर है यह महंगा होगा!

सबसे अच्छा शर्त यह है कि कंटेनर विनाशक clear() पर कॉल करता है, जिसे erase(begin(), end()) के रूप में परिभाषित किया गया है, लेकिन मुझे इसके लिए कोई आवश्यकता नहीं मिल रही है। मानक केवल तालिका 65 में "रैखिक जटिलता" कहता है।

+1

मुझे नहीं पता कि यह क्यों कम किया गया था, क्योंकि डरावनी अनाम डाउनवॉटर टिप्पणी छोड़ने में असफल रहा। मुझसे +1 –