คำตอบที่เซบาสเตียนมีความถูกต้อง แต่ผมอยากจะรู้ว่าทำไมมันปลอดภัยดังนั้นฉันทำบางขุดเข้าไปในรหัสที่มาแผนที่ ดูเหมือนว่าในการโทรไป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