คำตอบที่เซบาสเตียนมีความถูกต้อง แต่ผมอยากจะรู้ว่าทำไมมันปลอดภัยดังนั้นฉันทำบางขุดเข้าไปในรหัสที่มาแผนที่ ดูเหมือนว่าในการโทรไปdelete(k, v)นั้นโดยพื้นฐานแล้วเพียงแค่ตั้งค่าสถานะ (เช่นเดียวกับการเปลี่ยนค่าการนับ) แทนที่จะลบค่าจริง:
b->tophash[i] = Empty;
(ค่าว่างคือค่าคงที่0)
สิ่งที่แผนที่ดูเหมือนจะทำจริงคือการจัดสรรจำนวนที่เก็บข้อมูลที่กำหนดขึ้นอยู่กับขนาดของแผนที่ซึ่งจะเพิ่มขึ้นเมื่อคุณทำการแทรกในอัตรา2^B(จากซอร์สโค้ดนี้ ):
byte *buckets; // array of 2^B Buckets. may be nil if count==0.
ดังนั้นจึงมีการจัดสรรที่เก็บข้อมูลมากกว่าที่คุณใช้อยู่เกือบตลอดเวลาและเมื่อคุณทำrangeบนแผนที่ระบบจะตรวจสอบtophashค่าของที่เก็บข้อมูลแต่ละรายการ2^Bเพื่อดูว่าสามารถข้ามไปได้หรือไม่
สรุปได้ว่าdeleteภายใน a rangeปลอดภัยเนื่องจากข้อมูลยังคงอยู่ในทางเทคนิค แต่เมื่อตรวจสอบtophashพบว่าสามารถข้ามไปได้และไม่รวมไว้ในrangeการดำเนินการใด ๆ ที่คุณกำลังดำเนินการอยู่ ซอร์สโค้ดยังรวมถึงTODO:
// TODO: consolidate buckets if they are mostly empty
// can only consolidate if there are no live iterators at this size.
สิ่งนี้อธิบายว่าเหตุใดการใช้delete(k,v)ฟังก์ชันนี้จึงไม่ทำให้หน่วยความจำว่างเพียงแค่ลบออกจากรายการที่เก็บข้อมูลที่คุณได้รับอนุญาตให้เข้าถึง หากคุณต้องการเพิ่มหน่วยความจำจริงคุณจะต้องทำให้แผนที่ทั้งหมดไม่สามารถเข้าถึงได้เพื่อที่การเก็บขยะจะเข้ามาคุณสามารถทำได้โดยใช้บรรทัดเช่น
map = nil