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 range
lebih dari peta, itu memeriksa tophash
nilai setiap ember di 2^B
dalamnya untuk melihat apakah dapat melompati itu.
Untuk meringkas, delete
dalam a range
aman karena data secara teknis masih ada, tetapi ketika memeriksa tophash
itu melihat bahwa itu bisa melewatinya dan tidak memasukkannya dalam range
operasi 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