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