2010-05-07 13 views
5
vector<int> vect; 
int *int_ptr = new int(10); 
vect.push_back(*int_ptr); 

मैं स्टैंड है कि हर "नया" कुछ बिंदु पर पीछा किए जाने की आवश्यकता एक "हटाएँ" द्वारा लेकिन स्पष्ट() विधि इस स्मृति को साफ करता है के तहत?सी ++ मेमोरी आवंटन सवाल को शामिल वैक्टर

क्या ही बात कर की इस पद्धति के बारे में: मैं क्या समझ से

vector<int> vect; 
int int_var = 10; 
vect.push_back(int_var); 

, स्पष्ट() कॉल चर विनाशकर्ता, लेकिन इस उदाहरण में दोनों vect.push_back() तरीकों पर एक वस्तु को धक्का वेक्टर, एक सूचक नहीं। तो क्या इंट पॉइंटर का उपयोग करने वाला पहला उदाहरण स्मृति को साफ करने के लिए स्पष्ट() के अलावा कुछ और चाहिए?

उत्तर

5

पहली विधि लीक क्योंकि वेक्टर आवंटित सूचक का स्वामित्व कभी नहीं लेता है। वास्तव में, इसमें एक सूचक नहीं है, केवल मूल्य की एक प्रति।

दूसरी विधि रिसाव नहीं करती है, क्योंकि कोई स्मृति गतिशील रूप से आवंटित नहीं होती है (वेक्टर में आंतरिक रूप से छोड़कर - यह उस स्मृति को स्वयं ही संभाल लेगा)।

+0

जब आप कहते हैं कि यह स्मृति को स्वयं ही संभाल लेगा, तो मेरा मतलब है कि मैं एक वेक्टर.क्लर() को कॉल करने के बाद? – TheFuzz

+0

जब वेक्टर नष्ट हो जाता है तो स्मृति पुनर्प्राप्त की जाएगी। 'स्पष्ट()' वास्तव में किसी भी स्मृति को रद्द नहीं करेगा; यदि वे बाद में फिर से बढ़ने की जरूरत है तो वेक्टर क्षमता बनाए रखेगा। –

+0

तो मुझे पॉइंटर्स का उपयोग न करने और बस अस्थायी स्टैक वैरिएबल बनाने से रोकने के लिए क्या रोक रहा है, फिर मुझे वेक्टर पर धक्का दे रहा है जब मुझे आवश्यकता हो? कुछ कारणों से पॉइंटर्स ने अपना अंक खो दिया। – TheFuzz

5

जब आप push_back on a vector, तो आप 0 वेक्टर में डेटा के प्रतिलिपि जोड़ें। इसलिए, दोनों मामलों में, मूल डेटा को अभी भी मुक्त करने की आवश्यकता है। पहले मामले में, आपको इसे हटाना होगा; दूसरे में, इसे ढेर पॉइंटर द्वारा "मुक्त" किया जाएगा क्योंकि यह दायरे से बाहर हो जाता है।

2

वेक्टर पुश_बैक पर प्रतियां बनाते हैं। चूंकि एक सूचक 'बस एक और चर' होता है (लेकिन एक जो स्मृति को इंगित करता है), जब आप एक पूर्णांक सूचक को पुश_बैक करते हैं जिसे पहले आवंटित किया गया था, तो आप पॉइंटर के मान को वेक्टर में प्रतिलिपि बनाते हैं, जिससे संभावित खतरनाक पॉइंटर होता है, क्योंकि वहां स्मृति में एक ही स्थान पर इशारा करते हुए दो पॉइंटर्स बनें।

आपके पहले उदाहरण में, आपको मैन्युअल रूप से मेमोरी को हटाना होगा।

class graph //quick-format 
{ 
vector<node*> nodes; 
add_node(node n) 
{ 
    node *temp = new node; 
    *temp = n; 
    nodes.push_back(temp) 
} 
~graph() 
{ 
    for(int i = 0; i < nodes.size(); i++) 
     delete nodes[i]; 
} 
}; 

एक चेतावनी के रूप में, ग्राफ की प्रतिलिपि अर्थ विज्ञान: एक रणनीति मैं ग्राफ वर्गों के साथ दखल के लिए पहले उपयोग किए गए कुछ इस तरह (काम पर जा रहा है और जल्दी से टाइपिंग की वजह से सामान के विशाल मात्रा में संशोधित) है जांच की जानी चाहिए। जैसा कि यह खड़ा है, इसके परिणामस्वरूप पहले से मुक्त स्मृति को हटा दिया जाएगा। लाभ यह है कि आप हमेशा लटकने वाले नोड्स का एक ही सेट रख सकते हैं। कैविट एम्प्टर, किसी भी प्रत्यक्ष मेमोरी उपयोग की तरह ..

हालांकि, यदि आप केवल एक गैर-सूचक चर को धक्का देते हैं, तो आपके अंत से स्मृति लीक होने की कोई संभावना नहीं है। संभवतः वेक्टर रिसाव होगा, लेकिन ... उपकरण की परिपक्वता में इस बिंदु पर व्यावहारिक रूप से असंभव है।

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