Jawaban Sebastian akurat, tetapi saya ingin tahu mengapa itu aman, jadi saya melakukan penggalian ke dalam kode sumber Peta . Sepertinya pada panggilan ke delete(k, v), itu pada dasarnya hanya menetapkan bendera (serta mengubah nilai hitungan) daripada benar-benar menghapus nilai:
b->tophash[i] = Empty;
(Kosong adalah konstanta untuk nilainya 0)
Apa yang sebenarnya dilakukan oleh peta adalah mengalokasikan sejumlah ember tergantung pada ukuran peta, yang tumbuh saat Anda melakukan sisipan dengan laju 2^B(dari kode sumber ini ):
byte *buckets; // array of 2^B Buckets. may be nil if count==0.
Jadi hampir selalu ada lebih banyak ember yang dialokasikan daripada yang Anda gunakan, dan ketika Anda melakukan rangelebih dari peta, itu memeriksa tophashnilai setiap ember di 2^Bdalamnya untuk melihat apakah dapat melompati itu.
Untuk meringkas, deletedalam a rangeaman karena data secara teknis masih ada, tetapi ketika memeriksa tophashitu melihat bahwa itu bisa melewatinya dan tidak memasukkannya dalam rangeoperasi apa pun yang Anda lakukan. Kode sumber bahkan termasuk TODO:
// TODO: consolidate buckets if they are mostly empty
// can only consolidate if there are no live iterators at this size.
Ini menjelaskan mengapa menggunakan delete(k,v)fungsi ini sebenarnya tidak membebaskan memori, hanya menghilangkannya dari daftar bucket yang diizinkan untuk Anda akses. Jika Anda ingin mengosongkan memori yang sebenarnya, Anda harus membuat seluruh peta tidak dapat dijangkau sehingga pengumpulan sampah akan masuk. Anda dapat melakukan ini menggunakan garis seperti
map = nil