2014-10-21 22 views
8

Varsa, sınıf örneklerine unordered_map işaretçilerim var, bu eşlemdeki bir nesneyi silmek örneği de silebilir mi?std :: unordered_map <std :: String, myClass *> - std :: unordered_map :: erase() myClass 'DTor'unu çağırır mı?

(soruyu yanıtlama :) Bu örneği silmek istediysem hangi sürüm doğru olurdu?

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

veya basitçe

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

?

GÜNCELLEME: birçok kişi tarafından önerildiği gibi shared_ptr'u kullanmaya başladım ve harika çalışıyor!

+4

'silme 'kendiliğinden işaretçiyi sızdırıyordu. "Unique_ptr" nin bir haritasını kullanmayı düşünün. –

+0

İşaretçilerin sahipliğini alması gerekiyorsa, neden bir "unique_ptr" kullanmıyorsunuz, bu sizin için nesneyi silecek? – MicroVirus

+0

Teşekkür ederiz. Harita sadece bir arama ismidir, uygulamamın geri kalanı işaretçileri kullanmalıdır, bu yüzden serbest işaretçiyi kullanmamak için başka önlemler alıyorum. – St0fF

cevap

17

Hayır, ve bu C++ 11 olarak etiketlendiğinden, nesne işaretleyicilerinizi ilk önce yönetmek için std::unique_ptr/std::shared_ptr kullanıyor olmalısınız, örn. Eğer dini sizin işaretçileri erase herhangi aramadan önce delete d olduğundan emin olun bile

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

, yine aynı tuşa başka bir şey atarsanız dışı bir durum halinde meydana veya ne düşünmek zorundayız veya sızabilecek herhangi bir başka olasılık. new ve delete'u kullanmanız için çok iyi bir nedeniniz yoksa; std::unique_ptr/std::shared_ptr ve std::make_unique/'a yapıştırın, daha güvenlidir ve kodunuzun okunmasını kolaylaştırır.

+3

+1. ** Ve ** 'yeni' ve 'sil' kullanmak için çok iyi bir nedeniniz olsa bile, biraz daha düşünün ve bu nedenin aslında tüm riskleri ve zor bellek yönetimini getirmesi için yeterli olup olmadığını görün. – Angew

+0

Teşekkürler, bunu düşüneceğim ve sonunda bunu yapacağım. – St0fF

+0

@Angew: lütfen soruya güncellemeye bakın. Çok teşekkürler! – St0fF

İlgili konular