सेबेस्टियन का जवाब सटीक है, लेकिन मैं जानना चाहता था कि यह सुरक्षित क्यों था, इसलिए मैंने मैप सोर्स कोड में कुछ खुदाई की । ऐसा लगता है कि कॉल करने के लिए 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
एक 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