2012-02-25 11 views
19

संभव डुप्लिकेट:
Deleting pointers in a vectorक्या std :: वेक्टर ऑब्जेक्ट्स के पॉइंटर्स के विनाशक को कॉल करता है?

मैं जानता हूँ कि एक std::vector विलुप्त है जब, यह अपने वस्तुओं में से प्रत्येक के नाशक कॉल करेंगे। क्या यह वस्तुओं के लिए पॉइंटर्स के विनाशक को कॉल करता है?

vector<myclass*> stuff; 

जब सामान नष्ट हो जाता है, अलग-अलग वस्तुओं सामान अंदर संकेत द्वारा की ओर इशारा किया विलुप्त हो सकते हैं?

+0

देखें [boost :: ptr_vector ] (http://www.boost.org/doc/libs/1_49_0/libs/ptr_container/doc/ptr_vector.html) –

उत्तर

30

सं

कैसे std::vector पता करने के लिए कहा-पर आपत्ति नष्ट करने के लिए कैसे माना जाता है? क्या इसे delete का उपयोग करना चाहिए? delete[]? free? कुछ अन्य समारोह? यह कैसे पता होना चाहिए कि ऑब्जेक्ट्स को इंगित करने के लिए वास्तव में गतिशील रूप से आवंटित किया गया है या यह एक असली मालिक है और उन्हें नष्ट करने के लिए ज़िम्मेदार है?

यदि std::vector पॉइंट-टू ऑब्जेक्ट्स का एक ट्रू स्वामी है, तो std::unique_ptr का उपयोग करें, संभावित रूप से ऑब्जेक्ट्स की सफाई को संभालने के लिए कस्टम डिलीटर के साथ।

+1

यदि 'std :: vector' में कोई होगा कन्स्ट्रक्टर जो उन तत्वों के लिए विनाश समारोह लेता है जो बेवकूफ होंगे। यह विरासत या सी एपीआई के लिए उपयोगी होगा। लेकिन किसी भी तरह से चीजों को करने का बेहतर तरीका इस प्रकार के संसाधनों को आरएआईआई कक्षा के साथ लपेट रहा है। – wilhelmtell

+1

@ विल्हेल्मटेल आप इसके लिए एक कस्टम आवंटक लिख सकते हैं :) या 'unique_ptr' को कस्टम डिलीटर फ़ंक्शन दें। –

+0

@ सेठ कार्नेगी हाँ, यह टिप्पणी पोस्ट करने के बाद मुझे कुछ सेकंड मारा। सोचने से पहले बात करते हुए, हर समय मेरे साथ होता है। : -एस – wilhelmtell

5

नहीं; क्या होगा यदि आपने एक स्वचालित ऑब्जेक्ट में पॉइंटर संग्रहीत किया हो?

vector<T*> v; 
T tinst; 
v.push_back(&tinst); 

वेक्टर वस्तुओं संकेत करने के लिए, स्वत: वस्तु दो बार विलुप्त हो जाएगा इंगित विनाशकर्ता कॉल करता है - एक बार जब यह क्षेत्र से बाहर चला गया, और एक बार जब वेक्टर क्षेत्र से बाहर चला गया। साथ ही, अगर उन्हें delete के साथ हटाया नहीं जाना चाहिए? हर स्थिति में उचित तरीके से व्यवहार करने का कोई तरीका नहीं है।

यदि आपकी ऑब्जेक्ट्स गतिशील रूप से आवंटित की जाती हैं, तो आपको वेक्टर और delete प्रत्येक पॉइंटर को मैन्युअल रूप से पुन: सक्रिय करना होगा यदि इसे new के साथ आवंटित किया गया हो। वैकल्पिक रूप से, आप स्मार्ट संकेत दिए गए जो संकेत द्वारा पुनःआवंटन जाएगा वस्तुओं बताया का एक वेक्टर बना सकते हैं:

vector<shared_ptr<T>> v; 
v.push_back(new T); 
+0

एचएम। मुझे लगता है कि दूसरा शब्द, "क्योंकि", भ्रामक है। पॉइंट्स को हटाने का औचित्य सिद्ध करने के लिए वेक्टर पर नहीं है; बल्कि, ओपी को समझा जाना चाहिए कि एक कंटेनर * सूचकांक को अलग-अलग टाइप किए गए तत्वों का इलाज क्यों करना चाहिए। जैसा कि यह खड़ा है, जवाब एक साधारण, "नहीं" हो सकता है। –

+1

@KerrekSB तब हटा दिया गया :) –

15

के रूप में आप सही तरीके से अपने आप को कहा, वेक्टर उसके तत्वों के लिए कॉल विनाशकर्ता करता है। तो, आपके उदाहरण में वेक्टर "पॉइंटर्स के विनाशक" को कॉल करता है। हालांकि, आपको यह ध्यान रखना होगा कि पॉइंटर प्रकारों में कोई विनाशक नहीं है। केवल वर्ग के प्रकार में विनाशक हो सकते हैं। और पॉइंटर्स कक्षाएं नहीं हैं। तो, यह कहना सही है कि std::vector वेक्टर में संग्रहीत सूचक वस्तुओं को छद्म-विनाशक कॉल वाक्यविन्यास लागू करता है। पॉइंटर प्रकारों के लिए जिसके परिणामस्वरूप कोई ऑपरेशन नहीं होता है, यानी यह कुछ भी नहीं करता है।

यह आपके प्रश्न के दूसरे भाग का भी उत्तर देता है: चाहे पॉइंटर्स द्वारा इंगित myclass ऑब्जेक्ट्स नष्ट हो जाएं। नहीं, वे नष्ट नहीं हो जाते हैं।

इसके अलावा, ऐसा लगता है कि आप किसी भी तरह से मानते हैं कि "पॉइंटर्स पर विनाशकों को बुलावा" (आपके प्रश्न का पहला भाग) वही बात है जो "पॉइंट ऑब्जेक्ट्स को नष्ट कर रहा है" (आपके प्रश्न का दूसरा भाग)। हकीकत में ये दो पूरी तरह से अलग असंबंधित चीजें हैं।

पूर्व से बाद के लिंक को बनाने के लिए, यानी।वेक्टर को पॉइंट ऑब्जेक्ट्स को नष्ट करने के लिए, आपको सामान्य कच्चे myclass * पॉइंटर्स के विपरीत, किसी भी तरह के "स्मार्ट पॉइंटर्स" से अपने वेक्टर बनाने की आवश्यकता है। वेक्टर स्वचालित रूप से "स्मार्ट पॉइंटर्स" के विनाशकों को बुलाएगा और इन विनाशकों, बदले में, बिंदुओं को नष्ट कर देगा। यह "लिंक" केवल "स्मार्ट पॉइंटर के" विनाशक के अंदर स्पष्ट रूप से कार्यान्वित किया जा सकता है, यही कारण है कि सामान्य कच्चे पॉइंटर्स आपकी मदद नहीं कर सकते हैं।

+0

असल में यदि आप सटीक होना चाहते हैं, तो 'std :: vector' कुछ भी नष्ट नहीं करता है, आवंटक –

+0

+1 हाहा, बहुत अच्छा, स्पॉट-ऑन करता है। –

+0

यह स्वीकार्य उत्तर होना चाहिए क्योंकि यह दिखाता है कि क्यों पॉइंटर्स कोई विशेष मामला नहीं है। –