ठीक है कि मॉलॉक के बारे में कुछ जवाब पहले से ही पोस्ट किए गए थे।
अधिक दिलचस्प हिस्सा यह है कि कैसे निशुल्क काम करता है (और इस दिशा में, मॉलोक भी बेहतर समझा जा सकता है)।
कई मॉलॉक / नि: शुल्क कार्यान्वयन में, फ्री आमतौर पर मेमोरी को ऑपरेटिंग सिस्टम (या कम से कम केवल दुर्लभ मामलों में) में वापस नहीं करता है। कारण यह है कि आप अपने ढेर में अंतराल प्राप्त करेंगे और इस प्रकार यह हो सकता है, कि आप अपने 2 या 4 जीबी वर्चुअल मेमोरी को अंतराल के साथ समाप्त कर दें। इससे बचना चाहिए, क्योंकि जैसे ही वर्चुअल मेमोरी खत्म होगी, आप वास्तव में बड़ी परेशानी में पड़ जाएंगे। दूसरा कारण यह है, कि ओएस केवल मेमोरी चंक्स को संभाल सकता है जो एक विशिष्ट आकार और संरेखण के होते हैं। विशिष्ट होने के लिए: आम तौर पर ओएस केवल उन ब्लॉकों को संभाल सकता है जो वर्चुअल मेमोरी मैनेजर संभाल सकता है (सबसे अक्सर 512 बाइट्स के गुणक जैसे 4KB)।
तो ओएस को 40 बाइट्स वापस करना सिर्फ काम नहीं करेगा। तो मुफ्त में क्या करता है?
फ्री मेमोरी ब्लॉक को अपनी खुद की फ्री ब्लॉक सूची में रखेगा। आम तौर पर यह पता स्थान में आसन्न ब्लॉकों को एक साथ पिघलाने की भी कोशिश करता है। मुक्त ब्लॉक सूची मेमोरी चंक्स की सिर्फ एक गोलाकार सूची है जिसमें शुरुआत में कुछ प्रशासनिक डेटा होते हैं। यही कारण है कि मानक मॉलोक / मुक्त के साथ बहुत छोटे स्मृति तत्वों का प्रबंधन कुशल नहीं है। प्रत्येक मेमोरी चंक को अतिरिक्त डेटा की आवश्यकता होती है और छोटे आकार के साथ अधिक विखंडन होता है।
फ्री-लिस्ट भी पहली जगह है जो मैलोडोक को तब दिखती है जब मेमोरी के एक नए हिस्से की जरूरत होती है। ओएस से नई मेमोरी के लिए कॉल करने से पहले इसे स्कैन किया जाता है। जब एक हिस्सा पाया जाता है जो आवश्यक मेमोरी से बड़ा होता है, तो इसे दो भागों में विभाजित किया जाता है। एक को फोन करने वाले को लौटा दिया जाता है, दूसरे को मुफ्त सूची में डाल दिया जाता है।
इस मानक व्यवहार के लिए कई अलग-अलग अनुकूलन हैं (उदाहरण के लिए स्मृति की छोटी मात्रा के लिए)। लेकिन चूंकि मॉलोक और फ्री इतना सार्वभौमिक होना चाहिए, मानक व्यवहार हमेशा कमबैक होता है जब विकल्प उपयोग करने योग्य नहीं होते हैं। मुक्त-सूची को संभालने में भी अनुकूलन हैं - उदाहरण के लिए आकारों द्वारा क्रमबद्ध सूचियों में विखंडन को संग्रहीत करना। लेकिन सभी अनुकूलन की अपनी सीमाएँ भी हैं।
आपका कोड क्रैश क्यों होता है:
इसका कारण यह है कि 4 वर्णों के क्षेत्र के आकार में 9 वर्ण (अनुगामी नल बाइट को न भूलें) लिखकर, आप संभवतः स्मृति के एक अन्य भाग के लिए संग्रहीत प्रशासनिक-डेटा को अधिलेखित कर देंगे जो आपके डेटा के "पीछे" रहता है। चूँकि यह डेटा अक्सर मेमोरी चंक्स के "सामने" में संग्रहित होता है। जब नि: शुल्क तब अपने चंक को मुफ्त सूची में डालने की कोशिश करता है, तो यह इस प्रशासनिक-डेटा को छू सकता है और इसलिए एक अधिलेखित सूचक पर ठोकर खा सकता है। इससे सिस्टम क्रैश हो जाएगा।
यह एक बल्कि सुंदर व्यवहार है। मैंने उन स्थितियों को भी देखा है जहां एक भगोड़ा सूचक ने मेमोरी-फ्री-लिस्ट में डेटा को ओवरराइट कर दिया है और सिस्टम तुरंत दुर्घटनाग्रस्त नहीं हुआ, लेकिन बाद में कुछ सबरूटीन्स। मध्यम जटिलता की एक प्रणाली में भी ऐसी समस्याएं वास्तव में हो सकती हैं, वास्तव में डिबग करना कठिन है! जिस एक मामले में मैं शामिल था, उसे दुर्घटना के कारण का पता लगाने में हमें (डेवलपर्स का एक बड़ा समूह) कई दिन लगे - क्योंकि यह मेमोरी डंप द्वारा बताए गए स्थान से बिल्कुल अलग स्थान पर था। यह टाइम-बम की तरह है। तुम्हें पता है, आपका अगला "मुक्त" या "मॉलॉक" दुर्घटनाग्रस्त हो जाएगा, लेकिन आप नहीं जानते कि क्यों!
वे कुछ सबसे खराब C / C ++ समस्याएं हैं, और एक कारण है कि पॉइंटर्स इतनी समस्याग्रस्त हो सकते हैं।