2016-10-27 20 views
5

को देखते हुए में एक गतिशील आवंटित चर ले जाएँ निम्नलिखित सी ++ कोड है अगर myVec नष्ट हो गया है (गुंजाइश से बाहर चला जाता है)? क्या emplace_back के बजाय push_back का उपयोग करने में कोई अंतर है?एक वेक्टर

+4

आप "एक चर चलाना नहीं" हैं। आप एक वेक्टर तत्व जोड़ रहे हैं जिसका मूल्य ढेर पर वस्तु के समान है। –

+0

प्रेरणा स्पष्ट हो सकती है यदि आप 'std :: string' जैसे कुछ उपयोग करते हैं जहां चालक कन्स्ट्रक्टर और कॉपी कन्स्ट्रक्टर वास्तव में –

उत्तर

3

आप अपने वेक्टर में *num में संग्रहीत मूल्य की प्रतिलिपि बना रहे हैं।
यह ऐसा करने से बहुत अलग नहीं है:

int* num = new int(1); 
int cpy = *num; 

इसलिए हाँ, आपको उसे हटाना होगा।
वेक्टर आपके कोड में किसी भी तरह से पॉइंटर्स से निपटने के दौरान वस्तुओं के जीवनकाल को जादूगर रूप से संभाल नहीं पाते हैं।


आप unique_ptr s का उपयोग अगर आप अपने वस्तुओं के लिए नियंत्रित जीवन काल करना चाहते हैं कर सकते हैं:

myVec.emplace_back(std::make_unique<int>(1)); 

वैसे भी, इस std::vector<int> से std::vector<std::unique_ptr<int>> लिए वेक्टर के प्रकार बदलने के लिए की आवश्यकता है।

अन्यथा, आप यह कर सकते हैं:

std::vector<int> myVec; 
auto num = std::make_unique<int>(1); 
myVec.emplace_back(*num); 

आवंटित स्मृति के रूप में जल्द num इसके दायरे से बाहर चला जाता है के रूप में मुक्त हो जाएगा।

+2

भिन्न होता है "वेक्टर जादूगर रूप से निहित वस्तुओं के जीवनकाल को संभाल नहीं पाते हैं।" - लेकिन वे करते हैं। वस्तुओं की आजीवन नहीं, तत्वों की प्रतियां हैं। – emlai

+0

@tuple_cat pointers_ के _in मामले को याद किया। धन्यवाद। – skypjack

2
अपने मामले क्योंकि आप एक आदिम प्रकार int जो केवल कॉपी किया जायेगा उपयोग कर रहे हैं एक कदम उत्पन्न नहीं होंगे

लेकिन फिर भी जब आप एक वेक्टर आप अभी भी स्मृति को रिहा करने की जरूरत में ढेर पर एक वस्तु का ले जाने मूल्य क्योंकि चलती मूल्य अभी भी एक में वस्तु से चले गए छोड़ देता है वैध राज्य। यह अभी भी मौजूद है और इसका उपयोग किया जा सकता है। चल रहा है इसका प्रभाव यह है कि इसका मूल्य बदल सकता है और इसलिए जब तक आप एक नया पुन: असाइन नहीं करते हैं तब तक इसका मूल्य भरोसा नहीं किया जा सकता है।

अगर आप कदम मूल्य यह अभी भी बनी हुई है के रूप में एक वैध ढेर पर वस्तु तो मैं अभी भी स्वतंत्र रूप से क्या करने के लिए के लिए ले जाया होता है कीको हटाने की जरूरत है के लिए emplace_back() या push_back() का उपयोग यह कोई फर्क नहीं पड़ता वेक्टर में तत्व।

तो std::move() की सुविधा (लेकिन गारंटी नहीं है) चलतीसामग्री (या मूल्य) वस्तु की - नहीं वस्तु ही तो ले जाया वस्तु अभी भी जरूरत से हटा रहा है।