2014-10-21 12 views
8

मान लीजिए कि मेरे पास क्लास इंस्टेंस के पॉइंटर्स के unordered_map हैं, तो उस मानचित्र से किसी ऑब्जेक्ट को मिटाना भी उदाहरण को मिटा देगा?std :: unordered_map <std :: स्ट्रिंग, myClass *> - std :: unordered_map :: मिटाएं() myClass 'DTor को कॉल करता है?

(प्रश्न को दोबारा दर्ज करना :) अगर मैं उस उदाहरण को हटाना चाहता हूं, तो कौन सा संस्करण सही होगा?

if(it != map.end()) 
{ 
    delete it->second; 
    map.erase(it); 
} 

या बस

if(it != map.end()) 
    map.erase(it); 

?

अद्यतन: जैसा कि कई लोगों द्वारा सुझाया गया है, मैं shared_ptr का उपयोग करने के लिए चला गया, और यह बहुत अच्छा काम करता है!

+4

'मिटाएं' पॉइंटर को रिसाव करेगा। 'Unique_ptr' के मानचित्र का उपयोग करने पर विचार करें। –

+0

यदि इसे पॉइंटर्स का स्वामित्व लेने की आवश्यकता है, तो 'unique_ptr' का उपयोग क्यों न करें, जो आपके लिए ऑब्जेक्ट को हटा देगा? – MicroVirus

+0

धन्यवाद। नक्शा केवल एक लुकअप-बाय-नाम है, मेरे बाकी ऐप को पॉइंटर्स का उपयोग करने की आवश्यकता है, इसलिए मैं एक मुक्त पॉइंटर का उपयोग न करने के लिए अन्य सावधानी बरतता हूं। – St0fF

उत्तर

17

नहीं, और चूंकि इसे टैग किया गया है C++ 11 आपको पहले ऑब्जेक्ट पॉइंटर्स को प्रबंधित करने के लिए std::unique_ptr/std::shared_ptr का उपयोग करना चाहिए, उदा।

std::unordered_map<std::string, std::unique_ptr<myClass>> 

भले ही आप धार्मिक सुनिश्चित करें कि आपके संकेत erase के लिए किसी भी कॉल करने से पहले delete घ कर रहे हैं, तब भी आप पर विचार करने के क्या एक अपवाद की स्थिति में क्या होगा, या यदि आप एक ही कुंजी के लिए कुछ और ही आवंटित राशि , या लीक हो सकता है कि अन्य संभावनाओं की किसी भी संख्या। जब तक आपके पास new और delete का उपयोग करने का बहुत अच्छा कारण नहीं है, तो नहीं; std::unique_ptr/std::shared_ptr और std::make_unique/std::make_shared पर चिपके रहें, यह सुरक्षित है और आपके कोड को पढ़ने में आसान बनाता है।

+3

+1। ** और ** यदि आपके पास 'नया' और 'हटाएं' का उपयोग करने का बहुत अच्छा कारण है, तो इसके बारे में कुछ और सोचें और देखें कि क्या यह कारण वास्तव में सभी जोखिमों और परेशानी के लिए पर्याप्त मेमोरी प्रबंधन लाता है। – Angew

+0

धन्यवाद, मैं इसके बारे में सोचूंगा और आखिरकार ऐसा करूंगा। – St0fF

+0

@Angew: कृपया प्रश्न के लिए अद्यतन देखें। आपका बहुत बहुत धन्यवाद! – St0fF

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