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