Hem C++ 11 hem de Boost'un hashmap neden yinelenen öğeleri silme sırasında yeniden boyutlandırma merak ediyorum. Bu teknik bir bellek sızıntısı olmasa bile, uygulamalarda ciddi bir sorun olabileceğini düşünüyorum (bu benim için gizli bir konuydu, geri izlemek için zor zamanlar geçirdi) ve aslında birçok uygulamayı etkileyebilirdi. Bu konteyner ile bir "tasarım hatası" mı?C++ 11/Boost `unordered_map` silme sırasında neden geri dönmez?
bunu benchmarked ve
sorunu yeniden oluşturmak için kod (VS, Clang, GCC dahil) çeşitli derleyici bültenleri etkileyen gibi görünüyor:
std::unordered_map<T1,T2> m;
for (int i = 0; i < 5000000; i++)
m.insert(std::make_pair(i, new data_type));
for (map_type::iterator it = m.begin(); it != m.end();) {
delete it->second;
it = m.erase(it);
}
Ben kullandığınız bir
self-contained test dosyası oluşturduk bellek kullanımını izlemek için özel ayırıcı.
Anladığım kadarıyla, bunun arkasında yatan neden yinelenen öğelerin silinmesi ve yinelenen öğelerin silinmemesi için geçerli yineleyiciler tutulmasıdır .. Öğeleri eklemek, yinelemeyi geçersiz kılan yeniden karışmalara neden olabileceğinden, bu biraz tuhaf bir gereksinimdir. Ben (Ben akıllı bir işaretçi içindeki haritayı sarılı olduğu sabit ve boşken ben sadece yeni bir boş harita yeniden nasıl
Wich olduğunu
Ama doğrudan harita yok edebilecek .., sonuçlandı Rehaş olmaktan daha hızlı olmak için nedenini bilmiyorum.). Genelde
Bildiğim kadarıyla olabildiğince
Üzgünüm. Düzenleme için teşekkürler. – GameDeveloper
Sanırım kendi sorunuzu doğru bir şekilde yanıtladı. Sadece mantığa katılmıyorsun. Burada, tasarım mantığını içeren teklifin bir bağlantısı vardır: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1456.html –
Sadece yineleyicilerin silinmesi gereken öğeleri silerken Bunun için iyi bir gerekçe vermeden geçerliliğini yitirmiş olmalısınız (tüm okunuşta güdülen birkaç ifadeden biri gibi görünmektedir). – GameDeveloper