Sebastian'ın cevabı doğru, ancak neden güvenli olduğunu bilmek istedim , bu yüzden Harita kaynak kodunu biraz araştırdım . Bir çağrıda göründüğü gibi, delete(k, v)
değeri gerçekten silmek yerine temelde sadece bir bayrak belirler (sayma değerini değiştirmenin yanı sıra):
b->tophash[i] = Empty;
(Boş, değer için sabittir 0
)
Haritanın gerçekte yaptığı şey, haritanın boyutuna bağlı olarak, 2^B
( bu kaynak koddan ) oranında ekleme gerçekleştirdikçe büyüyen belirli sayıda kova ayırmaktır :
byte *buckets; // array of 2^B Buckets. may be nil if count==0.
Dolayısıyla, neredeyse her zaman kullandığınızdan daha fazla kova tahsis edilir range
ve harita üzerinde bir yaptığınızda tophash
, her bir bölümün değerini 2^B
, atlayıp atlayamayacağını görmek için kontrol eder .
Özetlemek gerekirse, a'nın delete
içi range
güvenlidir, çünkü veriler teknik olarak hala oradadır, ancak kontrol ettiğinde, tophash
onu atlayabileceğini ve range
gerçekleştirdiğiniz işleme dahil etmeyebileceğini görür . Kaynak kodu şunları da içerir TODO
:
// TODO: consolidate buckets if they are mostly empty
// can only consolidate if there are no live iterators at this size.
Bu, delete(k,v)
işlevi kullanmanın neden hafızayı gerçekten boşaltmadığını, yalnızca onu erişmenize izin verilen paketler listesinden kaldırdığını açıklar . Eğer gerçek hafızayı boşaltmak istiyorsanız, çöp toplama işleminin devreye girmesi için tüm haritayı erişilemez hale getirmeniz gerekir. Bunu aşağıdaki gibi bir satır kullanarak yapabilirsiniz:
map = nil