Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> सी प्रोग्रामिंग

free() को कैसे पता चलता है कि कितनी मेमोरी डीअलोकेट करनी है?


free(ptr) केवल पॉइंटर लेता है, आकार नहीं। फिर भी यह सही मात्रा में मेमोरी मुक्त करता है।

आंतरिक कार्यप्रणाली

  1. मेटाडेटा स्टोरेज: जब malloc/calloc/realloc मेमोरी अलोकेट करते हैं, तो वे अनुरोधित आकार से **अधिक** मेमोरी अलोकेट करते हैं (आमतौर पर एक "हेडर" वर्ड अतिरिक्त)।
  2. हेडर में आकार: यह अतिरिक्त वर्ड अलोकेटेड ब्लॉक का आकार (और कभी-कभी अन्य मेटाडेटा जैसे मैजिक नंबर, फ्री लिस्ट पॉइंटर्स) स्टोर करता है।
  3. free **पॉइंटर से पहले** देखता है (आमतौर पर ptr - sizeof(size_t) या इम्प्लीमेंटेशन-डिफाइंड ऑफसेट) ताकि आकार पढ़ सके।
  4. फिर यह उस पूरे ब्लॉक (हेडर + यूजर डेटा) को फ्री लिस्ट में वापस करता है।

संकल्पनात्मक चित्रण

User pointer (ptr) ──────► ┌─────────────────────┐
                            │   User Data         │  ← अनुरोधित आकार
                            ├─────────────────────┤
                            │   Size Metadata     │  ← free() यहां पढ़ता है
                            └─────────────────────┘
                            ▲
Allocator returned ptr ─────┘ (ptr - header_size)

इम्प्लीमेंटेशन विवरण (glibc malloc - ptmalloc)

  • चंक्स (chunks) में मेमोरी प्रबंधित करता है।
  • प्रत्येक चंक में size फील्ड (निचले बिट्स फ्लैग्स के लिए उपयोग) होता है।
  • फ्रीड चंक्स में फॉरवर्ड/बैकवर्ड पॉइंटर्स होते हैं (डबल-लिंक्ड फ्री लिस्ट)।
  • स्मॉल बिन्स, लार्ज बिन्स, फास्टबिन्स, अनसॉर्टेड बिन्स लिए अलग-अलग बिन्स।

महत्वपूर्ण निहितार्थ

  • पॉइंटर वैध होना चाहिए: free को वही पॉइंटर पास करें जो malloc ने रिटर्न किया था।
  • डबल फ्री: दो बार free करने से हीप करप्शन होता है।
  • इनवैलिड पॉइंटर: स्टैक/ग्लोबल एड्रेस या ऑफसेट पॉइंटर पास करने से क्रैश/करप्शन।
  • आकार क्वेरी: मानक C में अलोकेटेड आकार क्वेरी करने का कोई पोर्टेबल तरीका नहीं (कुछ इम्प्लीमेंटेशन्स malloc_usable_size प्रदान करते हैं)।
  1. मैक पर रैम (मेमोरी) कैसे खाली करें: आसान तरीके मैक पर रैम (मेमोरी) कैसे खाली करें: आसान तरीके

    क्या आपका मैक दर्दनाक रूप से धीमा चल रहा है? क्या कोई एप्लिकेशन अभी-अभी हैंग हुआ है? क्या आपको Your system has run out of application memory संदेश या डरावना स्पिनिंग बीच बॉल दिखाई दिया? ये सभी संकेत हो सकते हैं कि आपकी मेमोरी, या RAM, अधिकतम उपयोग की जा रही है। अपने मैक पर RAM को कैसे साफ़ करें और अ

  1. विंडोज 10 पर अपनी रैम साइज और स्पीड जांचें: चरण-दर-चरण गाइड विंडोज 10 पर अपनी रैम साइज और स्पीड जांचें: चरण-दर-चरण गाइड

    आपकी रैम (रैंडम एक्सेस मेमोरी) आपके पीसी के समग्र प्रदर्शन में प्रमुख योगदानकर्ताओं में से एक है। प्रोग्राम खुले रहने पर रैम का उपभोग करते हैं, इसलिए कई ऐप्स के साथ मल्टीटास्किंग के लिए आपको पर्याप्त मेमोरी उपलब्ध होने की आवश्यकता होती है। आप विंडोज 10 के टास्क मैनेजर का उपयोग करके अपने सिस्टम में क

  1. वेबसाइट की वैधता कैसे सत्यापित करें: चरण-दर-चरण गाइड वेबसाइट की वैधता कैसे सत्यापित करें: चरण-दर-चरण गाइड

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