सी गतिशील स्मृति आवंटन

सी गतिशील स्मृति आवंटन, सी क्रमादेशन भाषा में सी क्रमादेशन भाषा में प्रकार्य के समूह के माध्यम से मॉलोक, रियललोक, कॉलोक, एलायंस_आलोक और निःशुल्क के माध्यम से गतिशील स्मृति आवंटन के लिए मैनुअल स्मृति प्रबंधन करने को संदर्भित करता है।

C++ क्रमादेशन भाषा में ये प्रकार्य सम्मिलित हैं; तथापि, प्रचालक नए और विलोप प्रचालक समान कार्यक्षमता प्रदान करते हैं और उस भाषा के लेखकों द्वारा अनुशंसित होते हैं। फिर भी, ऐसी कई स्थितियाँ हैं जिनमें नए/विलोप का उपयोग करना अनुप्रयोज्य नहीं होता है, जैसे कचरा संग्रहण कूट या प्रदर्शन-संवेदनशील कूट, और उच्च-स्तरीय नए प्रचालक के बदले मॉलोक और नियोजन नए के संयोजन की आवश्यकता हो सकती है।

मॉलोक द्वारा उपयोग किए जाने वाले वास्तविक स्मृति आवंटन तंत्र के कई अलग-अलग कार्यान्वयन उपलब्ध हैं। निष्पादन समय और आवश्यक स्मृति दोनों में उनका प्रदर्शन भिन्न होता है।

तर्क
सी क्रमादेशन भाषा स्मृति को स्थिर, स्वचालित या गतिशील रूप से प्रबंधित करती है। स्थिर-अवधि चर मुख्य स्मृति में आवंटित किए जाते हैं, सामान्यतः क्रमादेश के निष्पादन योग्य कूट के साथ, और क्रमादेश के जीवनकाल के लिए बने रहते हैं; स्वचालित-अवधि चर स्टैक पर आवंटित किए जाते हैं और आते और जाते हैं जैसे प्रकार्य को कहा जाता है और वापस आते हैं। स्थैतिक-अवधि और स्वचालित-अवधि चर के लिए, आवंटन का आकार संकलन-समय स्थिर होना चाहिए (चर-लंबाई स्वचालित सरणी के प्रकरण को छोड़कर) । यदि आवश्यक आकार कार्यावधि तक ज्ञात नहीं है (उदाहरण के लिए, यदि यादृच्छिक आकार का डेटा उपयोगकर्ता या डिस्क फ़ाइल से पढ़ा जा रहा है), तो निश्चित आकार के डेटा का वस्तुओं का उपयोग करना अपर्याप्त है।

आवंटित स्मृति का जीवनकाल भी चिंता का कारण बन सकता है। सभी स्थितियों के लिए न तो स्थिर- और न ही स्वचालित-अवधि स्मृति पर्याप्त है। स्वचालित-आवंटित डेटा कई प्रकार्य कॉलों में नहीं बना रह सकता है, जबकि स्थैतिक डेटा क्रमादेश के जीवन के लिए बना रहता है चाहे इसकी आवश्यकता हो या नहीं। कई स्थितियों में क्रमादेश को आबंटित स्मृति के जीवनकाल के प्रबंधन में अधिक सुनम्यता की आवश्यकता होती है।

गतिशील स्मृति आवंटन का उपयोग करके इन सीमाओं से बचा जाता है, जिसमें स्मृति अधिक स्पष्ट रूप से (लेकिन अधिक लचीला) प्रबंधित होती है, सामान्यतः इसे से आवंटित करके, इस उद्देश्य के लिए संरचित स्मृति का एक क्षेत्र है। सी में, हीप पर स्मृति के ब्लॉक को आवंटित करने के लिए लाइब्रेरी फलन का उपयोग किया जाता है। क्रमादेश स्मृति के इस ब्लॉक को एक सूचक के माध्यम से अभिगम करता है जो मॉलोक रिटर्न करता है। जब स्मृति की आवश्यकता नहीं रह जाती है,तो सूचक को मुक्त करने के लिए पास किया जाता है जो स्मृति को आवंटन कर देता है ताकि इसे अन्य उद्देश्यों के लिए उपयोग किया जा सके।

सी के मूल विवरण ने संकेत दिया कि कॉलोक और मानक लाइब्रेरी में थे, लेकिन नहीं थे। यूनिक्स के लिए भंडारण प्रबंधक के सरल मॉडल कार्यान्वयन के लिए कूट आवंटन के साथ दिया गया था और उपयोगकर्ता अंतरापृष्ठ कार्यों के रूप में मुक्त था, और संचालन प्रणाली से स्मृति का अनुरोध करने के लिए sbrk प्रणाली कॉल का उपयोग कर रहा था। छठा संस्करण यूनिक्स प्रलेखन आवंटन और मुक्त को निम्न-स्तरीय स्मृति आवंटन कार्यों के रूप में देता है। उनके आधुनिक रूप में मॉलोक और मुक्त दिनचर्या पूरी तरह से 7वें संस्करण यूनिक्स हस्तचालित में वर्णित हैं।

कुछ प्लेटफॉर्म लाइब्रेरी या आंतरिक फलन कॉल प्रदान करते हैं जो हीप (जैसे के बदले सी स्टैक से कार्यावधि गतिशील आवंटन की अनुमति देते हैं। कॉलिंग कार्य समाप्त होने पर यह स्मृति स्वचालित रूप से मुक्त हो जाती है।

कार्यों का अवलोकन
सी गतिशील स्मृति आवंटन कार्यों को  हेडर (  सी ++ में हेडर) में परिभाषित किया गया है।

और

 * एक तर्क लेता है (बाइट्स में आवंटित करने के लिए स्मृति की मात्रा), जबकि दो तर्क लेता है - तत्वों की संख्या और प्रत्येक तत्व का आकार।
 * केवल स्मृति आवंटित करता है, जबकि  आवंटित क्षेत्र में बाइट को आवंटित और शून्य पर समुच्चय करता है।

उपयोग उदाहरण
स्वत: विस्तार के साथ दस पूर्णांकों की एक सरणी बनाना सी में सीधा है:

तथापि, संकलन समय पर सरणी का आकार तय किया गया है। यदि कोई चर-लंबाई_अरे का उपयोग किए बिना एक समान सरणी को गतिशील रूप से आवंटित करना चाहता है, जो सभी C11 कार्यान्वयनों में समर्थित होने की गारंटित नहीं है, तो निम्न कूट का उपयोग किया जा सकता है:

यह उन बाइट्स की संख्या की गणना करता है जो दस पूर्णांक स्मृति में कब्जा कर लेते है, फिर अनुरोध करता है कि  से कई बाइट्स और परिणाम को   नामक सूचक को निर्धारित करें ( सी वाक्य रचना के कारण, कुछ स्थितियों में संकेतक और सरणियों का उपयोग एक दूसरे के रूप में किया जा सकता है)।

क्योंकि  अनुरोध को पूरा करने में सक्षम नहीं हो सकता है, यह एक शून्य सूचक लौटा सकता है और यह जांचने के लिए अच्छा क्रमादेशन अभ्यास है: int *array = malloc(10 * sizeof(int)); if (array == NULL) { fprintf(stderr, "malloc failed\n"); return -1; } जब क्रमादेश को गतिशील सरणी की आवश्यकता नहीं होती है, तो उसे मुक्त संग्रह ग्रहण करने वाली स्मृति को वापस करने के लिए कॉल मुक्त करना होगा:

द्वारा अलग की गई स्मृति को प्रारंभ नहीं किया गया है और इसमें क्रॉफ्ट हो सकता है: पहले प्रयोग किए गए और छोड़े गए डेटा के अवशेष। के साथ आवंटन के बाद, सरणी के तत्व अप्रारंभीकृत चर हैं। आदेश   एक आवंटन लौटाएगा जो पहले ही साफ हो चुका है: int *array = calloc(10, sizeof(int)); रीयलोक के साथ हम एक सूचक बिंदु की स्मृति की मात्रा का आकार बदल सकते हैं। उदाहरण के लिए, यदि हमारे पास आकार $$n$$ की सरणी के रूप में कार्य करने वाला सूचक है और हम इसे आकार $$m$$ की एक सरणी में बदलना चाहते हैं,तो हम रीयलोक का उपयोग कर सकते हैं। int *arr = malloc(2 * sizeof(int)); arr[0] = 1; arr[1] = 2; arr = realloc(arr, 3 * sizeof(int)); arr[2] = 3; ध्यान दें कि रीयलोक को ब्लॉक का आधार पता बदलना चाहिए (यानी यदि यह मूल ब्लॉक के आकार को बढ़ाने में विफल रहा है, और इसलिए कहीं और एक नया बड़ा ब्लॉक आवंटित किया है और इसमें पुराने विषय की प्रतिलिपि बनाई है)। इसलिए, मूल ब्लॉक के भीतर पतों के लिए कोई संकेतक भी अब मान्य नहीं हैं।

सुरक्षा प्रकार
एक शून्य सूचक देता है, जो इंगित करता है कि यह अज्ञात डेटा प्रकार के क्षेत्र के लिए सूचक है। मजबूत प्रकार की प्रणाली के कारण C++ में संचक का उपयोग आवश्यक है, जबकि सी में ऐसा नहीं है। कोई "संचक" कर सकता है (प्रकार रूपांतरण देखें) यह सूचक एक विशिष्ट प्रकार के लिए: int *ptr, *ptr2; ptr = malloc(10 * sizeof(*ptr)); /* without a cast */ ptr2 = (int *)malloc(10 * sizeof(*ptr)); /* with a cast */ ऐसी संचक करने के लाभ और नुकसान हैं।

संचक करने के लाभ

 * संचक को सम्मिलित करने से सी क्रमादेश या फलन को C++ के रूप में संकलित करने की अनुमति मिल सकती है।
 * संचक के 1989 के पूर्व के संस्करणों के लिए अनुमति देता है जो मूल रूप से एक  देता है।
 * कास्टिंग से डेवलपर को प्रकार के आकार में विसंगतियों की पहचान करने में मदद मिल सकती है, यदि गंतव्य सूचक प्रकार में परिवर्तन होता है, खासकर यदि सूचक को दूर घोषित किया गया हो  कॉल (हालांकि आधुनिक संकलक और स्थिर विश्लेषक कलाकारों की आवश्यकता के बिना इस तरह के व्यवहार पर चेतावनी दे सकते हैं
 * संचकन से विकासक को प्रकार के आकार में विसंगतियों की पहचान करने में सहायता मिल सकती है, विशेष रूप से अगर सूचक को कॉल से दूर घोषित किया जाता है (यद्यपि आधुनिक संकलक और स्थिर विश्लेषक संचक की आवश्यकता के बिना इस तरह के व्यवहार पर चेतावनी दे सकते हैं)।

संचकन करने के नुकसान

 * सी मानक के अंतर्गत, संचक अनावश्यक है।
 * संचक जोड़ने से हेडर  को सम्मिलित करने में विफल हो सकते है, जिसमें   के लिए फलन आदिप्ररूप पाया जाता है।   के लिए एक आदिप्ररूप की अनुपस्थिति में, C90 मानक के लिए आवश्यक है कि सी संकलक मानता है कि   एक   देता है। यदि कोई संचक नहीं है, तो C90 को नैदानिक की आवश्यकता होती है जब यह पूर्णांक सूचक को निर्दिष्‍ट किया जाता है; तथापि, संचक के साथ, इस निदान का उत्पादन नहीं किया जाएगा, एक बग को छिपाते हुए। कुछ वास्तुकला और डेटा मॉडल पर (जैसे 64-बिट प्रणाली पर LP64, जहां   और सूचक्स 64-बिट हैं और   32-बिट है), यह त्रुटि वास्तव में अपरिभाषित व्यवहार का परिणाम हो सकती है, क्योंकि निहित रूप से घोषित  32- रिटर्न देता है। बिट मान जबकि वास्तव में परिभाषित फलन 64-बिट मान लौटाता है। कॉलिंग सम्मेलन और स्मृति लेआउट के आधार पर, इसका परिणाम स्टैक उत्तम हो सकता है। आधुनिक संकलकों में इस मुद्दे पर किसी का ध्यान नहीं जाने की संभावना कम है, क्योंकि C99 निहित घोषणाओं की अनुमति नहीं देता है, इसलिए संकलक को निदान का उत्पादन करना चाहिए, भले ही वह   रिटर्न मान ले।
 * यदि इसकी घोषणा पर सूचक का प्रकार बदल दिया गया है, तो किसी को भी सभी पंक्तियों को बदलने की आवश्यकता हो सकती है जहां  को संबोधित और संचक किया जाता है।

सामान्य त्रुटियाँ
गतिशील स्मृति आवंटन का अनुचित उपयोग प्रायः बग का स्रोत हो सकता है। इनमें सुरक्षा बग या क्रमादेश क्रैश सम्मिलित हो सकते हैं, जो प्रायः विभाजन दोषों के कारण होते हैं।

सबसे सामान्य त्रुटियां इस प्रकार हैं:

आवंटन विफलताओं की जांच नहीं करना:
स्मृति आवंटन सफल होने की गारंटित नहीं है, और इसके बदले एक शून्य सूचक प्रतिगमन कर सकता है। यदि आबंटन सफल है, तो जाँच किए बिना दिए गए मान का उपयोग करना, अपरिभाषित व्यवहार को आमंत्रित करता है। यह सामान्यतः दुर्घटना की ओर जाता है (नल सूचक विचलन पर परिणामी विभाजन दोष के कारण), लेकिन इस बात की कोई गारंटित नहीं है कि क्रैश होगा इसलिए उस पर भरोसा करने से भी समस्याएँ हो सकती हैं।

स्मृति रिसाव:
नि: शुल्क का उपयोग करके स्मृति को हटाने में विफलता गैर-पुन: प्रयोज्य स्मृति का निर्माण करती है, जो अब क्रमादेश द्वारा उपयोग नहीं की जाती है। यह स्मृति संसाधनों को असफल करता है और इन संसाधनों के समाप्त होने पर आवंटन विफल हो सकता है।

तार्किक त्रुटियां:
सभी आवंटनों को एक ही प्रतिरूप का पालन करना चाहिए: का उपयोग करके आवंटन, डेटा संग्रह करने के लिए उपयोग, नि: शुल्क का उपयोग करके पुनःआवंटन। इस प्रतिरूप का पालन करने में विफलता, जैसे नि: शुल्क कॉल के बाद स्मृति उपयोग (झूलने वाला सूचक)   (जंगली सूचक) पर कॉल करने से पहले, दो बार   कॉल करना (दोगुना मुक्त), आदि, सामान्यतः एक विभाजन दोष का कारण बनता है और क्रमादेश के क्रैश होने का परिणाम होता है। ये त्रुटियां क्षणिक और डिबग करने में कठिन हो सकती हैं - उदाहरण के लिए, मुक्त स्मृति को सामान्यतः OS द्वारा तुरंत पुनः प्राप्त नहीं किया जाता है, और इस प्रकार निलंबित संकेत थोड़ी देर के लिए बने रह सकते हैं और काम करने लगते हैं।

इसके अतिरिक्त, एएनएसआई सी मानकीकरण से पहले एक अंतरापृष्ठ के रूप में, malloc और इसके संबंधित कार्यों में ऐसे व्यवहार होते हैं जिन्हें जानबूझकर स्वयं के लिए परिभाषित करने के लिए कार्यान्वयन के लिए छोड़ दिया गया था। उनमें से एक शून्य-लंबाई आवंटन है, जो कि realloc के साथ अधिक समस्या है क्योंकि यह शून्य का आकार बदलने के लिए अधिक सामान्य है। यद्यपि POSIX और ऐकल यूनिक्स विशिष्टता दोनों को 0-आकार के आवंटन के उचित संचालन की आवश्यकता होती है, या तो NULL या कुछ और जो सुरक्षित रूप से मुक्त किया जा सकता है, इन नियमों का पालन करने के लिए सभी प्लेटफार्मों की आवश्यकता नहीं है। इसके कारण होने वाली कई दोगुनी-मुक्त त्रुटियों में, 2019 व्हाट्सप्प आरसीई विशेष रूप से प्रमुख था। इन कार्यों को आवृत की एक शैली उन्हें सुरक्षित बनाने के लिए केवल 0-आकार के आवंटन की जाँच करना और उन्हें आकार 1 में बदलना है। (रिटर्निंग) NULL इसकी अपनी समस्याएँ हैं: यह अन्यथा एक स्मृति से बाहर विफलता का संकेत देता है। realloc के प्रकरण में यह संकेत होगा कि मूल स्मृति को स्थानांतरित नहीं किया गया था और मुक्त नहीं किया गया था, जो फिर से आकार 0 के प्रकरण में नहीं है, जिससे दोगुना-मुक्त हो जाता है।)

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

हीप-आधारित
संभाजक का कार्यान्वयन सामान्यतः हीप स्मृति या डेटा खंड का उपयोग करके किया जाता है। आवंटक सामान्यतः आवंटन अनुरोधों को पूरा करने के लिए हीप का विस्तार और अनुबंध करता है।

हीप विधि कुछ अंतर्निहित दोषों से ग्रस्त है, जो पूरी तरह से विखंडन से उत्पन्न है। स्मृति आबंटन की किसी भी विधि की तरह, हीप खंडित हो जाएगा; अर्थात्, हीप पर आवंटित स्थान में प्रयुक्त और अप्रयुक्त स्मृति के खंड होंगे। हीप का विस्तार करने का सहारा लेने से पहले एक अच्छा आवंटक उपयोग करने के लिए पहले से आवंटित स्मृति के अप्रयुक्त क्षेत्र को खोजने का प्रयास करेगा। इस पद्धति के साथ प्रमुख समस्या यह है कि हीप में केवल दो महत्वपूर्ण विशेषताएं हैं: आधार, या आभासी स्मृति स्पेस में हीप का आरंभ; और लंबाई, या इसका आकार। हीप को अपनी पूरी लंबाई भरने के लिए पर्याप्त प्रणाली स्मृति की आवश्यकता होती है, और इसका आधार कभी नहीं बदल सकता है। इस प्रकार, अप्रयुक्त स्मृति का कोई भी बड़ा क्षेत्र व्यर्थ हो जाता है। हीप इस स्थिति में "अटक" सकता है यदि हीप के अंत में एक छोटा प्रयुक्त खंड अस्तित्व है, जो पता स्थान की किसी भी राशि को व्यर्थ कर सकता है। अक्रिय स्मृति आवंटन योजनाओं पर, जैसे कि प्रायः लिनक्स संचालन प्रणाली में पाए जाते हैं, एक बड़ा हीप अनिवार्य रूप से समकक्ष प्रणाली स्मृति को आरक्षित नहीं करता है; यह केवल पहली बार लिखने के समय ही ऐसा करेगा (गैर-मैप किए गए स्मृति पृष्ठ शून्य पर लौटते हैं)। इसकी ग्रैन्युलैरिटी पृष्ठ आकार पर निर्भर करती है।

डीएलमॉलोक और पीटीमॉलोक
डौग ली ने 1987 में प्रारम्भ होने वाले एक सामान्य-उद्देश्य आवंटक के रूप में सार्वजनिक डोमेन डीएलमॉलोक ("डौग ली का मॉलोक") विकसित किया है। GNU C लाइब्रेरी (glibc) वोल्फ्राम ग्लोगर के पीटीमॉलोक (pthreads malloc) से ली गई है, जो थ्रेडिंग से संबंधित डीएलमॉलोक का एक द्विशाख है। नवंबर 2019 तक, डीएलमॉलोक का नवीनतम संस्करण अगस्त 2012 से संस्करण 2.8.6 है।

डीएलमॉलोक एक सीमा टैग आवंटक है। हीप पर स्मृति को "हिस्से" के रूप में आवंटित किया जाता है, एक 8-बाइट संरेखित डेटा संरचना जिसमें एक हेडर और प्रयोग करने योग्य स्मृति होती है। आवंटित स्मृति में हिस्से के आकार और उपयोग के झंडे (डोप सदिश के समान) के लिए 8- या 16-बाइट ओवरहेड होता है। अनाबंटित हिस्से उपयोग करने योग्य स्थान क्षेत्र में अन्य मुक्त हिस्से के लिए संकेत को भी संग्रह करते हैं, जिससे 32-बिट प्रणाली पर न्यूनतम हिस्सा आकार 16 बाइट्स और 64-बिट प्रणाली पर 24/32 (संरेखण पर निर्भर करता है) बाइट्स बनते हैं।

असंबद्ध स्मृति को समान आकार के "डिब्बे" में समूहीकृत किया जाता है, जिसे हिस्से की दुगुनी-संबद्‌ध सूची का उपयोग करके कार्यान्वित किया जाता है (हिस्से के अंदर असंबद्ध स्थान में संग्रहीत संकेत के साथ)। डिब्बे आकार आधार पर तीन वर्गों में क्रमबद्ध गए हैं: खेल विकसक एड्रियन स्टोन का तर्क है किdlmalloc, एक सीमा-टैग आवंटक के रूप में, कंसोल प्रणाली के लिए अमित्र है जिसमें आभासी स्मृति है लेकिन मांग पृष्ठन नहीं है। ऐसा इसलिए है क्योंकि इसके पूल-सिकुड़ते और बढ़ते कॉलबैक (सिसालोक/सिस्ट्रिम) का उपयोग आभासी स्मृति के अलग-अलग पृष्ठ को आवंटित करने और समर्पण करने के लिए नहीं किया जा सकता है। मांग पृष्ठन के अभाव में विखंडन एक बड़ी चिंता बन जाता है।
 * 256 बाइट्स ("स्मॉलबिन" अनुरोध) से नीचे के अनुरोधों के लिए, एक साधारण दो शक्ति श्रेष्ठतम आसंजन संभाजक का उपयोग किया जाता है। यदि उस बिन में कोई मुक्त ब्लॉक नहीं है, तो अगले उच्चतम बिन से एक ब्लॉक दो भागों में विभाजित हो जाता है।
 * 256 बाइट्स या उससे ऊपर के अनुरोधों के लिए, लेकिन mmap देहली के नीचे, v2.8.0 के बाद से डीएलमॉलोक स्वस्था ने बिटवाइज़ ट्राई कलनविधीय ("ट्रीबिन") का उपयोग करता है। यदि अनुरोध को पूरा करने के लिए कोई खाली स्थान नहीं बचा है, तो सामान्यतः brk प्रणाली कॉल के माध्यम से हीप के आकार को बढ़ाने का प्रयत्न करता है। यह सुविधा पीटीमॉलोक (v2.7.x से) बनने के बाद प्रस्तावित की गई थी, और इसके परिणामस्वरूप यह glibc का हिस्सा नहीं है, जो पुराने सबसे सर्वोत्तम योग्य आवंटक को विरासत में मिला है।
 * एमएमएपी थ्रेसहोल्ड ("लार्जबिन" अनुरोध) से ऊपर के अनुरोधों के लिए, स्मृति हमेशा एमएमएपी प्रणाली कॉल का उपयोग करके आवंटित की जाती है। थ्रेसहोल्ड सामान्यतः 256 KB है। एमएमएपी प्रणाली बड़े बफ़र्स के साथ उनकी समाप्ति के बाद अंत में एक छोटे से आवंटन को फंसाने की समस्या को टालती है, लेकिन हमेशा स्मृति के एक पूरे पृष्ठ को आवंटित करती है, जो कई वास्तुकला पर आकार में 4096 बाइट्स है।

FreeBSD's और NetBSD's jemalloc
FreeBSD 7.0 और NetBSD 5.0 ​​के बाद से, पुराने  कार्यान्वयन (पॉल-हेनिंग कैंप द्वारा phkmalloc) को जेसन इवांस द्वारा लिखित jemalloc द्वारा प्रतिस्थापित किया गया था। इसका मुख्य कारण बहु सूत्रण के संबंध में phkmalloc की मापनीयता की कमी थी। लॉक विवाद से बचने के लिए, jemalloc प्रत्येक सीपीयू के लिए अलग "एरेनास" का उपयोग करता है। बहु सूत्रण अनुप्रयोग में प्रति सेकंड आवंटन की संख्या को मापने वाले प्रयोगों से पता चला है कि यह इसे थ्रेड्स की संख्या के साथ रैखिक रूप से पैमाना करता है, जबकि phkmalloc और डीएलमॉलोक दोनों के लिए प्रदर्शन थ्रेड्स की संख्या के व्युत्क्रमानुपाती था।

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

ग्राफीनोस परियोजना प्रारंभ में ओपनबीएसडी के स्मृति आवंटनकर्ता को एंड्रॉइड की बायोनिक सी लाइब्रेरी में पोर्ट करके प्रारंभ की गई थी।

होर्ड मॉलोक
होर्ड एक संभाजक है जिसका लक्ष्य मापनीय स्मृति आवंटन प्रदर्शन है। ओपनबीएसडी आवंटक की तरह, होर्ड विशेष रूप से  का उपयोग करता है, लेकिन 64 किलोबाइट के टुकड़ों में स्मृति का प्रबंधन करता है जिसे सुपरब्लॉक कहा जाता है। होर्ड के हीप को तार्किक रूप से एक वैश्विक हीप और कई प्रति-संसाधित्र हीप में विभाजित किया गया है। इसके अलावा, एक थ्रेड-स्थानीय कैश है जो सीमित संख्या में सुपरब्लॉक रख सकता है। स्थानीय प्रति-थ्रेड या प्रति-संसाधित्र हीप पर केवल सुपरब्लॉक से आवंटित करके, और ज्यादातर खाली सुपरब्लॉक को वैश्विक हीप में ले जाकर अन्य संसाधित्र द्वारा पुन: उपयोग किया जा सकता है, थ्रेड्स की संख्या के साथ रैखिक मापनीयता प्राप्त करते समय होर्ड विखंडन को कम रखता है।

मिमललोक
प्रदर्शन पर ध्यान देने के साथ माइक्रोसॉफ्ट अनुसंधान से एक खुला स्त्रोत संहत सामान्य-उद्देश्य स्मृति संभाजक। लाइब्रेरी कूट की लगभग 11,000 पंक्तियाँ हैं।

थ्रेड-कैशिंग मॉलोक (टीसीमॉलोक)
छोटे आवंटन के लिए प्रत्येक थ्रेड में थ्रेड-स्थानीय भंडारण होता है। बड़े आवंटन के लिए mmap या sbrk का उपयोग किया जा सकता है। TCMalloc, Google द्वारा विकसित एक malloc, मृत थ्रेड के स्थानीय भंडारण के लिए कचरा संग्रह है। टीसीएमलोक को बहुप्रचारित क्रमादेशों के लिए glibc के पीटीमॉलोक से दुगने से भी अधिक तेज़ माना जाता है।

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

अधिभावी मॉलोक
क्योंकि  और उसके परिजन किसी क्रमादेश के प्रदर्शन पर एक मजबूत प्रभाव डाल सकते हैं, यह सीमा कार्यान्वयन द्वारा किसी विशिष्ट अनुप्रयोग के कार्यों को अध्यारोहण करने के लिए असामान्य नहीं है जो कि अनुप्रयोग के आवंटन प्रतिरूप के लिए अनुकूलित हैं। सी मानक ऐसा करने का कोई प्रकार प्रदान नहीं करता है, लेकिन संचालन प्रणाली ने गतिशील संयोजन का समुपयोजन कर ऐसा करने के कई प्रकार स्थापित हैं। प्रतीकों को अध्यारोहण करने के लिए एक प्रकार केवल एक अलग लाइब्रेरी में संयोजक करना है। एक अन्य, यूनिक्स प्रणाली V.3 द्वारा नियोजित,   और   फलन संकेत जो एक अनुप्रयोग सीमा प्रकार्य पर पुनर्नियोजन कर सकता है।

POSIX-जैसी प्रणालियों पर सबसे सामान्य रूप पर्यावरण चर एलडी_प्रीलोड को आवंटक के पथ के साथ समुच्चय करना है, ताकि गतिशील लिंकर libc कार्यान्वयन के बदले मॉलोक/कॉलोक/नि: शुल्क के उस संस्करण का उपयोग करे।

आवंटन आकार की सीमा
सबसे बड़ी संभावित स्मृति ब्लॉक  आवंटित कर सकते हैं जो मेजबान प्रणाली पर निर्भर करता है, विशेष रूप से भौतिक स्मृति का आकार और संचालन प्रणाली कार्यान्वयन।

सैद्धांतिक रूप से, सबसे बड़ी संख्या वह अधिकतम मान होनी चाहिए जिसे  प्रकार में रखा जा सकता है, जो एक कार्यान्वयन-निर्भर अहस्ताक्षरित पूर्णांक है जो स्मृति के क्षेत्र के आकार का प्रतिनिधित्व करता है। C99 मानक में और बाद में, यह   से   स्थिरांक के रूप में उपलब्ध है। यद्यपि ISO C द्वारा गारंटितकृत नहीं है, यह सामान्यतः  होता है।

ग्लिबैक प्रणाली पर, सबसे बड़ा संभावित स्मृति ब्लॉक  आवंटित कर सकता हैं जो इस आकार का केवल आधा है, अर्थात्.

विस्तार और विकल्प
विभिन्न संचालन प्रणाली और अनुभाषक के साथ सी लाइब्रेरी कार्यान्वयन शिपिंग मानक  अंतरापृष्ठ के विकल्प और विस्तार के साथ आ सकता है। इनमें से उल्लेखनीय है:


 * , जो कॉल स्टैक पर बाइट्स की अनुरोधित संख्या आवंटित करता है। कोई संबंधित पुनःआवंटन फलन उपस्थित नहीं है, क्योंकि सामान्यतः कॉलिंग फलन के वापस आते ही स्मृति को हटा दिया जाता है।  UNIX/32V|32/V (1978) से ही यूनिक्स प्रणाली पर उपस्थित था, लेकिन इसका उपयोग कुछ (जैसे, अंत:स्थापित) संदर्भों में समस्याग्रस्त हो सकता है। जबकि कई अनुभाषक द्वारा समर्थित है, यह एएनएसआई-सी मानक का भाग नहीं है और इसलिए हमेशा सुवाह्‍य नहीं हो सकता है। यह मामूली प्रदर्शन समस्याओं का कारण भी हो सकता है: यह चर-आकार के स्टैक फ़्रेमों की ओर ले जाती है, ताकि स्टैक और फ़्रेम संकेत दोनों को प्रबंधित करने की आवश्यकता हो (निश्चित आकार के स्टैक फ़्रेमों के साथ, इनमें से एक अनावश्यक है)। बड़े आवंटन से स्टैक अतिप्रवाह के कारण अपरिभाषित व्यवहार का जोखिम भी बढ़ सकता है। C99 ने वैकल्पिक स्टैक आवंटन तंत्र के रूप में चर-लंबाई सरणियों की प्रस्तुत की –  हालाँकि, इस सुविधा को बाद के C11 मानक में वैकल्पिक रूप से हटा दिया गया था।
 * POSIX एक फलन को परिभाषित करता है  को परिभाषित करता है जो दर्शनाथी-निर्दिष्ट संरेखण के साथ स्मृति आवंटित करता है। इसके आबंटनों को नि: शुल्क में आवंटित किया जाता है, इसलिए कार्यान्वयन को सामान्यतः मॉलोक लाइब्रेरी का भाग होना चाहिए।

यह भी देखें

 * बफर अतिप्रवाह
 * स्मृति दोषमार्जक
 * स्मृति सुरक्षा
 * पृष्ठ आकार
 * चर-लंबाई सरणी

बाहरी संबंध

 * Definition of malloc in IEEE Std 1003.1 standard
 * Lea, Doug; The design of the basis of the glibc allocator
 * Gloger, Wolfram; The पीटीमॉलोक homepage
 * Berger, Emery; The Hoard homepage
 * Douglas, Niall; The nedmalloc homepage
 * Evans, Jason; The jemalloc homepage
 * Google; The tcmalloc homepage
 * Simple Memory Allocation Algorithms on OSDEV Community
 * Michael, Maged M.; Scalable Lock-Free Dynamic Memory Allocation
 * Bartlett, Jonathan; Inside memory management – The choices, tradeoffs, and implementations of dynamic allocation
 * Memory Reduction (GNOME) wiki page with much information about fixing malloc
 * C99 standard draft, including TC1/TC2/TC3
 * Some useful references about C
 * ISO/IEC 9899 – Programming languages – C
 * Understanding glibc malloc