2010-07-01 21 views
9

मेरे पास एक नक्शा है जिसमें मेरा मूल्य गतिशील रूप से आवंटित किया गया है। जब मैं किसी तत्व पर मिटा देता हूं(), क्या यह स्मृति को मुक्त करता है या बस मानचित्र से तत्व को हटा देता है।सी ++ नक्शा मिटाएं()

मुझे वास्तव में स्मृति को रखने की आवश्यकता है। मुझे बस मानचित्र से तत्व को हटाने की आवश्यकता है क्योंकि इस गतिशील रूप से आवंटित संरचना कोड में कहीं और उपयोग की जाती है।

+3

क्या _exactly_ आपका मतलब है? 'std :: map' गतिशील रूप से अपने मूल्य आवंटित करेगा और आपके लिए अपना जीवनकाल प्रबंधित करेगा। 'मिटाएं' तत्व को हटा देगा और नष्ट कर देगा। यदि आपके मानचित्र में मान वास्तव में बाहरी आवंटित वस्तुओं के लिए पॉइंटर्स हैं तो नष्ट हो गया है केवल पॉइंटर है और ऐसा कुछ भी नहीं है जो यह इंगित कर रहा हो। –

+0

हां। मेरे मानचित्र में मान बाहरी रूप से आवंटित ऑब्जेक्ट i.e. पॉइंटर को कुछ है। स्पष्टीकरण के लिए धन्यवाद .. इसे गड़बड़ करो! –

+0

क्या आप एक उत्तर स्वीकार करने जा रहे हैं? –

उत्तर

11

नहीं, अगर यह नग्न सूचक है तो यह स्मृति को मुक्त नहीं करता है। आपको यह सुनिश्चित करने की ज़रूरत है कि स्मृति उचित रूप से हटा दी गई हो।

  • यदि आप नग्न पॉइंटर का उपयोग कर रहे हैं तो सुनिश्चित करें कि जब आपको आवश्यकता हो तो आप मेमोरी को ठीक से साफ कर लें।

  • यदि आप एक स्मार्ट पॉइंटर का उपयोग कर रहे हैं और मानचित्र ऑब्जेक्ट का अंतिम संदर्भ रखता है, तो मैप मिटाए जाने पर मेमोरी स्मार्ट पॉइंटर के विनाशक द्वारा साफ हो जाएगी।

एसटीएल कंटेनर आपकी याददाश्त का प्रबंधन नहीं करेंगे, इसलिए सुनिश्चित करें कि आप इसे करें। ऑब्जेक्ट्स को कंटेनर में डालते समय मैं लगभग हमेशा बूस्ट के shared_ptr का उपयोग करता था।

+1

मुझे लगता है कि स्वामित्व को स्पष्ट रूप से परिभाषित करना बेहतर है (जब भी लागू हो) जो हर जगह 'shared_ptr' को अंधा कर देता है और चक्रों के जोखिम में चला जाता है। इम्हो बूस्ट पॉइंटर कंटेनर बेहतर होता है जब एक कंटेनर मेमोरी का मालिक होता है। –

+0

@Matthieu, अंधेरे से कुछ भी करने की सिफारिश नहीं की जाती है। बेशक, 'shared_ptr' का उपयोग करने का मतलब यह नहीं है कि आप इसे अंधा कर रहे हैं, जैसा कि आपको लगता है। –

+0

"मेरे पास पॉइंटर्स हैं जो मैं पास करना चाहता हूं" का जवाब अक्सर साझा किया जाता है "साझा_ptr का उपयोग करें"। और यह तुम्हारा जवाब है। यदि आप इस सवाल पर बारीकी से नजर रखते हैं, तो आप टिप्पणी करेंगे कि ओपी ** ** ** पॉइंटर को मानचित्र से मिटाए जाने पर स्मृति को मुक्त नहीं करना चाहिए .... इसलिए उसके लिए 'shared_ptr' का उपयोग करने का कोई कारण नहीं है '। –

9

जब आप erasemap<something,something_else*> से, यह केवल मानचित्र से तत्व को हटा देता है। यह मिटाए गए तत्व पर delete ऑपरेटर (या कोई अन्य फ़ंक्शन) को मुक्त स्मृति पर कॉल नहीं करता है।

4

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

5

नहीं, आपके मानचित्र में पॉइंटर्स द्वारा संदर्भित वस्तुओं को हटाया नहीं जाएगा।

सी ++ मानक पुस्तकालय में कंटेनर मूल्य अर्थशास्त्र है। वे आपके द्वारा रखी गई वस्तुओं को नष्ट कर देंगे। जब वे वस्तुएं पॉइंटर्स होती हैं, तो इन पॉइंटर्स को नष्ट कर दिया जाएगा, लेकिन उन वस्तुओं को नहीं जिन्हें वे संदर्भित कर रहे हैं।

उपयोग boost_shared_ptr<> (std::map< key, boost_shared_ptr<value> >) या std::tr1::shared_ptr<> या std::shared_ptr<>, अपने वातावरण यह समर्थन करता है तो, सबसे स्मृति से संबंधित मुद्दों से छुटकारा पाने के।

+0

वह * जरूरी नहीं है * उन वस्तुओं को लीक कर रहा है यदि उनके पास कहीं और संकेत है जो वह उपयोग कर रहे हैं। –

+0

@ केन: अच्छा बिंदु, मैंने इस सवाल को काफी अच्छी तरह से नहीं पढ़ा। इसे इंगित करने के लिए धन्यवाद, मैंने इसे ठीक किया। – sbi

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