2012-12-19 16 views
32

मान लीजिए कि मेरे पास स्ट्रक्चर के std :: वेक्टर हैं। यदि वेक्टर स्पष्ट है() डी? स्मृति के साथ क्या होता है?क्या std :: vector स्मृति स्पष्ट पर मुक्त है?

std::vector<myStruct> vecs; 
vecs.resize(10000); 
vecs.clear(); 

क्या स्मृति को मुक्त किया जाएगा, या फिर भी वेक्स वैरिएबल से पुन: प्रयोज्य बफर के रूप में जोड़ा जाएगा?

+1

'क्षमता()' को कॉल करने का प्रयास करें। –

+0

सभी को धन्यवाद। मैं चाहता हूं कि स्मृति मुक्त हो - गारंटीकृत। इसलिए मैं नए std: vector का उपयोग कर वेक्टर आवंटित करता हूं, फिर जब मैं कर रहा हूं तो हटाएं। इस प्रकार स्मृति मुक्त होने की गारंटी है। –

+3

@ एंड्रयूएस: गतिशील आवंटन का एकमात्र प्रभाव एक अक्षमता पेश करना है। वेक्टर खाली करने के उचित तरीके के लिए जेरी का जवाब देखें। एक पाश शरीर में एक और अच्छा तरीका है कि वेक्टर को लूप बॉडी में स्थानीय बनाना है, यानी इसे लूप बॉडी के अंदर घोषित करें। –

उत्तर

42

स्मृति वेक्टर से जुड़ा हुआ है। यदि आप इसे मुक्त करना चाहते हैं, तो सामान्य खाली वेक्टर के साथ स्वैप करना है। सी ++ 11 में shrink_to_fit सदस्य फ़ंक्शन भी शामिल है जिसका उद्देश्य मोटे तौर पर समान क्षमता प्रदान करना है, लेकिन यह गैर-बाध्यकारी है (दूसरे शब्दों में, यह अतिरिक्त मेमोरी जारी करने की संभावना है, लेकिन अभी भी ऐसा करने की ज़रूरत नहीं है)।

6

विनाशक वस्तुओं पर बुलाया जाता है, लेकिन स्मृति आवंटित बनी हुई है।

19

वेक्टर की स्मृति को मंजूरी देने की गारंटी नहीं है। स्पष्ट होने के बाद आप तत्वों को सुरक्षित रूप से एक्सेस नहीं कर सकते हैं। यकीन है कि स्मृति स्कॉट Meyers पुनः आवंटित की जाती है यह करने के लिए सलाह दी करने के लिए:

vector<myStruct>().swap(vecs); 

Cplusplus.com इस पर कहने के लिए निम्नलिखित है:

, वेक्टर से सभी तत्वों को निकालता है उनके संबंधित विनाशकर्ता बुला, छोड़ने 0.

के साथ कंटेनर वेक्टर क्षमता में बदलाव नहीं होता है, और इस समारोह को कॉल करने के लिए के कारण कोई पुनरावृत्ति नहीं होती है। एक सामान्य विकल्प जो पुनर्वितरण को स्वैप का उपयोग करना है: ...

4

नहीं, स्मृति मुक्त नहीं होती है।

सी ++ 11 में, आप वेक्टर को मुक्त करने के लिए shrink_to_fit विधि का उपयोग कर सकते हैं।

http://www.cplusplus.com/reference/vector/vector/

+3

आप इसका उपयोग कर सकते हैं, लेकिन मानक निर्दिष्ट करता है कि यह * अतिरिक्त * स्मृति को रिलीज़ करने के लिए मजबूर नहीं करता है (§23.3.6.3/6): "shrink_to_fit क्षमता() को आकार() को कम करने के लिए एक बाध्यकारी अनुरोध है।" –

+1

... और इस प्रकार, यह 'आकार (0)' के रूप में उतना ही अच्छा है जितना * स्मृति * –

+0

नहीं जारी करने का दुष्प्रभाव हो सकता है, 'आकार बदलें (0) 'है [स्मृति को रखने की गारंटी] (http: //en.cppreference.com/w/cpp/container/vector/resize)। –