2010-02-25 11 views
8

इस प्रश्न को मुझसे एक साक्षात्कार में पूछा गया था।क्या होता है जब हेप मैनेजर द्वारा आवंटित स्मृति मुक्त करने का प्रयास किया जाता है, जो पूछने के लिए अधिक आवंटित करता है?

मान लीजिए कि char * p = malloc (n) एन से अधिक निर्दिष्ट करता है, कहें कि स्मृति के एन बाइट आवंटित किए गए हैं और मुक्त (पी) पी को आवंटित स्मृति को मुक्त करने के लिए उपयोग किया जाता है।

क्या प्रबंधक प्रबंधक इतनी दोषपूर्ण आवंटन कर सकता है? अब क्या होता है, क्या एन बाइट मुक्त हो जाएंगे या एन बाइट मुक्त हो जाएंगे?

क्या यह जानने के लिए कोई तरीका है कि कितनी मेमोरी मुक्त हो जाती है?

संपादित

वहाँ किसी भी विधि कितनी स्मृति मुक्त हो जाता है मिल रहा है?

कुछ नहीं से बेहतर, के रूप में "फ्रेड लार्सन" द्वारा बताया

mallinfo() कुछ प्रकाश डाला सकता है

+6

आपको ऐसा लगता है कि ऐसा आवंटन दोषपूर्ण क्यों है? भले ही कितने "वास्तविक" बाइट्स 'malloc() 'आवंटित किए गए हों, आप केवल' n' बाइट्स का उपयोग कर सकते हैं, और 'मुक्त()' आवंटित बाइट्स को मुक्त कर देंगे। अधिकतर 'मॉलोक' कार्यान्वयन अधिक जगह आवंटित करते हैं, फिर दक्षता कारणों के लिए अनुरोध किया जाता है। एक कार्यान्वयन 'मॉलोक' और 'मुक्त' को परिभाषित करता है, और परिभाषा के अनुसार, उन्हें आवंटन की योजना पर सहमत होना होता है। –

उत्तर

8

हां, यह लगभग हर बार होता है जब आप malloc() करते हैं। malloc ब्लॉक हेडर में ब्लॉक के आकार के बारे में जानकारी है, और जब free() कहा जाता है, तो वह उस राशि को ढेर पर वापस कर देता है। यह दोषपूर्ण नहीं है, यह ऑपरेशन की उम्मीद है।

उदाहरण के लिए, एक साधारण कार्यान्वयन, बदले गए पॉइंटर से पहले तुरंत अंतरिक्ष में ब्लॉक के आकार को स्टोर कर सकता है। फिर, free() कुछ इस तरह दिखेगा:

void free(void *ptr) 
{ 
    size_t *size = (size_t *)ptr - 1; 

    return_to_heap(ptr, *size); 
} 

कहाँ return_to_heap() यहाँ प्रयोग किया जाता है एक समारोह है कि भविष्य में उपयोग के लिए ढेर करने के लिए स्मृति की निर्दिष्ट ब्लॉक लौटने की वास्तविक काम करता है मतलब है।

+0

क्या यह पता लगाने के लिए कोई तरीका है कि कितनी मेमोरी मुक्त हो जाती है? – Rozuur

+0

@rozuur: 'malloc() 'द्वारा आवंटित सभी मेमोरी को' मुक्त()' से मुक्त कर दिया जाएगा। मुझे लगता है कि आपका असली सवाल यह पता लगाने के लिए है कि कितनी मेमोरी आवंटित की गई थी। (और जवाब? कम से कम जितना अनुरोध किया गया था, अगर आवंटन सफल हुआ।) – Bill

+1

रोज़ूर: इस पृष्ठ को देखें: http://msdn.microsoft.com/en-us/library/ms220938(VS.80) .aspx यह एक विचार देता है कि जब आप स्मृति के एक हिस्से के लिए पूछते हैं तो वास्तव में क्या किया जाता है। अधिकांश कार्यान्वयन इस तरह के समान हैं। – ThePosey

4

हाँ, ढेर प्रबंधक से अधिक n बाइट्स के एक ब्लॉक वापस जाने के लिए अनुमति दी है। free का उपयोग करके लौटाए गए पॉइंटर को मुक्त करने के लिए यह पूरी तरह से सुरक्षित (और आवश्यक है!), और free इसे सभी को रद्द कर देगा।

कई ढेर कार्यान्वयन ढेर में मेटाडेटा के ब्लॉक डालने से उनके आवंटन को ट्रैक करते हैं। free उस मेटाडेटा को यह निर्धारित करने के लिए देखेगा कि कितनी मेमोरी को हटाना है। यह कार्यान्वयन-विशिष्ट है, हालांकि, यह जानने का कोई तरीका नहीं है कि malloc ने आपको दिया है, और आम तौर पर, आपको परवाह नहीं करना चाहिए।

1

आम तौर पर हीप मैनेजर जो कुछ भी आवंटित किया जाता है उसे मुक्त कर देगा। यह कहीं भी इस जानकारी को संग्रहीत करता है, और इसे देखता है जब free() कहा जाता है।

एक ढेर प्रबंधक "दोषपूर्ण" नहीं है अगर यह अनुरोध की तुलना में अधिक स्मृति आवंटित करता है। हीप प्रबंधक अक्सर निश्चित ब्लॉक आकार के साथ काम करते हैं, और अनुरोध को पूरा करते समय अगले उचित ब्लॉक आकार तक पहुंच जाएंगे। ढेर प्रबंधक का काम जितना संभव हो उतना कुशल होना चाहिए, और अक्सर बड़ी क्षमताएं कुछ छोटी अक्षमताओं से होती हैं।

+0

"अक्सर बड़ी क्षमताएं कुछ छोटी अक्षमताओं से होती हैं" अच्छा उद्धरण 8 ^) – caseman

1

यह मॉलोक का डिफ़ॉल्ट व्यवहार है। यह NULL या कम से कम जब तक आपसे पूछा गया था, स्मृति के एक भाग में एक सूचक वापस लौटाएगा। तो हाँ मुफ्त के लिए पूछे जाने वाले समय से अधिक स्मृति से छुटकारा पाने में सक्षम होना चाहिए।

यह पता लगाना कि वास्तव में कितनी मेमोरी मुक्त थी या आवंटित एक मंच विशिष्ट प्रश्न है।

1

अन्य उत्तरों ने अच्छी तरह से समझाया है कि ब्लॉक आकार को कैसे नियंत्रित किया जाता है। यह पता लगाने के लिए कि कितनी मेमोरी मुक्त हो गई है, केवल एक ही समाधान जिसे मैं सोच सकता हूं, mallinfo() को पहले और बाद में कॉल करना है।

संबंधित मुद्दे

 संबंधित मुद्दे