सी गतिशील स्मृति आवंटन: Difference between revisions

From Vigyanwiki
(TEXT)
No edit summary
 
(14 intermediate revisions by 4 users not shown)
Line 1: Line 1:
{{Use dmy dates|date=May 2021|cs1-dates=y}}
{{Use dmy dates|date=May 2021|cs1-dates=y}}
{{C Standard Library}}
{{C Standard Library}}
सी [[गतिशील स्मृति आवंटन]], सी प्रोग्रामिंग भाषा में सी प्रोग्रामिंग भाषा में प्रकार्य के समूह के माध्यम से मॉलोक, रियललोक, कॉलोक, एलायंस_आलोक और निःशुल्कके माध्यम से गतिशील स्मृति आवंटन के लिए मैनुअल मेमोरी प्रबंधन करने को संदर्भित करता है।<ref name="c99">{{cite book |title=7.20.3 Memory management functions |work=ISO/IEC 9899:1999 specification |page=313 |url=http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf }}</ref><ref>{{cite web |last=Summit |first=Steve |title=Chapter 11: Memory Allocation |work=C Programming Notes |url=http://www.eskimo.com/~scs/cclass/notes/sx11.html |access-date=11 July 2020}}</ref><ref>{{cite web|url=https://linux.die.net/man/3/aligned_alloc|title=aligned_alloc(3) - Linux man page}}</ref>
सी [[गतिशील स्मृति आवंटन]], सी क्रमादेशन भाषा में सी क्रमादेशन भाषा में प्रकार्य के समूह के माध्यम से मॉलोक, रियललोक, कॉलोक, एलायंस_आलोक और निःशुल्क के माध्यम से गतिशील स्मृति आवंटन के लिए हस्तचालित स्मृति प्रबंधन करने को संदर्भित करता है।<ref name="c99">{{cite book |title=7.20.3 Memory management functions |work=ISO/IEC 9899:1999 specification |page=313 |url=http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf }}</ref><ref>{{cite web |last=Summit |first=Steve |title=Chapter 11: Memory Allocation |work=C Programming Notes |url=http://www.eskimo.com/~scs/cclass/notes/sx11.html |access-date=11 July 2020}}</ref><ref>{{cite web|url=https://linux.die.net/man/3/aligned_alloc|title=aligned_alloc(3) - Linux man page}}</ref>


C++ प्रोग्रामिंग भाषा में ये प्रकार्य सम्मिलित हैं; तथापि, ऑपरेटर नए और डिलीट प्रचालक समान कार्यक्षमता प्रदान करते हैं और उस भाषा के लेखकों द्वारा अनुशंसित होते हैं।<ref>{{cite book |last=Stroustrup |first=Bjarne |author-link=Bjarne Stroustrup |year=2008 |title=Programming: Principles and Practice Using C++ |publisher=Addison Wesley |isbn=978-0-321-54372-1 |page=1009}}</ref> फिर भी, ऐसी कई स्थितियाँ हैं जिनमें नए/डिलीट का उपयोग करना अनुप्रयोज्य नहीं होता है, जैसे कचरा संग्रहण कोड या प्रदर्शन-संवेदनशील कोड, और उच्च-स्तरीय नए प्रचालक के बदले मॉलोक और नियोजन नए के संयोजन की आवश्यकता हो सकती है।  
C++ क्रमादेशन भाषा में ये प्रकार्य सम्मिलित हैं; तथापि, प्रचालक नए और विलोप प्रचालक समान कार्यक्षमता प्रदान करते हैं और उस भाषा के लेखकों द्वारा अनुशंसित होते हैं।<ref>{{cite book |last=Stroustrup |first=Bjarne |author-link=Bjarne Stroustrup |year=2008 |title=Programming: Principles and Practice Using C++ |publisher=Addison Wesley |isbn=978-0-321-54372-1 |page=1009}}</ref> फिर भी, ऐसी कई स्थितियाँ हैं जिनमें नए/विलोप का उपयोग करना अनुप्रयोज्य नहीं होता है, जैसे कचरा संग्रहण कूट या प्रदर्शन-संवेदनशील कूट, और उच्च-स्तरीय नए प्रचालक के बदले मॉलोक और नियोजन नए के संयोजन की आवश्यकता हो सकती है।  


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


== तर्क ==
== तर्क ==
सी प्रोग्रामिंग भाषा मेमोरी को [[स्थैतिक स्मृति आवंटन|स्थिर]], [[स्वचालित मेमोरी आवंटन|स्वचालित या गतिशील]] रूप से प्रबंधित करती है। स्थिर-अवधि चर मुख्य मेमोरी में आवंटित किए जाते हैं, सामान्यतः प्रोग्राम के निष्पादन योग्य कोड के साथ, और प्रोग्राम के जीवनकाल के लिए बने रहते हैं; स्वचालित-अवधि चर [[कॉल स्टैक|स्टैक]] पर आवंटित किए जाते हैं और आते और जाते हैं जैसे प्रकार्य को कहा जाता है और वापस आते हैं। स्थैतिक-अवधि और स्वचालित-अवधि चर के लिए, आवंटन का आकार संकलन-समय स्थिर होना चाहिए (चर-लंबाई स्वचालित सरणी के मामले को छोड़कर)<ref>{{cite web |url=https://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html |title=gcc manual |publisher=gnu.org |access-date=14 December 2008 }}</ref>। यदि आवश्यक आकार कार्यावधि तक ज्ञात नहीं है (उदाहरण के लिए, यदि मनमाना आकार का डेटा उपयोगकर्ता या डिस्क फ़ाइल से पढ़ा जा रहा है), तो निश्चित आकार के डेटा वस्तुओं का उपयोग करना अपर्याप्त है।
सी क्रमादेशन भाषा स्मृति को [[स्थैतिक स्मृति आवंटन|स्थिर]], [[स्वचालित मेमोरी आवंटन|स्वचालित या गतिशील]] रूप से प्रबंधित करती है। स्थिर-अवधि चर मुख्य स्मृति में आवंटित किए जाते हैं, सामान्यतः क्रमादेश के निष्पादन योग्य कूट के साथ, और क्रमादेश के जीवनकाल के लिए बने रहते हैं; स्वचालित-अवधि चर [[कॉल स्टैक|स्टैक]] पर आवंटित किए जाते हैं और आते जाते हैं जैसे प्रकार्य को कहा जाता है और वापस आते हैं। स्थैतिक-अवधि और स्वचालित-अवधि चर के लिए, आवंटन का आकार संकलन-समय स्थिर होना चाहिए (चर-लंबाई स्वचालित सरणी के प्रकरण को छोड़कर)<ref>{{cite web |url=https://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html |title=gcc manual |publisher=gnu.org |access-date=14 December 2008 }}</ref>। यदि आवश्यक आकार कार्यावधि तक ज्ञात नहीं है (उदाहरण के लिए, यदि यादृच्छिक आकार का डेटा उपयोगकर्ता या डिस्क फ़ाइल से पढ़ा जा रहा है), तो निश्चित आकार के डेटा का वस्तुओं का उपयोग करना अपर्याप्त है।


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


'''डायनेमिक मेमोरी''' आवंटन का उपयोग करके इन सीमाओं से बचा जाता है, जिसमें मेमोरी अधिक स्पष्ट रूप से (लेकिन अधिक लचीले ढंग से) प्रबंधित होती है, सामान्यतः इसे से आवंटित करके {{citation needed span|''free store'' (informally called the "heap"),|date=July 2022|reason=In my experience 'heap' is almost exclusively used in a C context. While free store is used in C++ context for the new/delete operators.}} इस उद्देश्य के लिए संरचित स्मृति का एक क्षेत्र। सी में, लाइब्रेरी फ़ंक्शन <code>malloc</code> हीप पर मेमोरी का एक ब्लॉक आवंटित करने के लिए उपयोग किया जाता है। प्रोग्राम मेमोरी के इस ब्लॉक को एक [[सूचक (कंप्यूटर प्रोग्रामिंग)]] के माध्यम से एक्सेस करता है <code>malloc</code> रिटर्न। जब मेमोरी की आवश्यकता नहीं रह जाती है, तो पॉइंटर को पास किया जाता है <code>free</code> जो मेमोरी को हटा देता है ताकि इसे अन्य उद्देश्यों के लिए इस्तेमाल किया जा सके।
गतिशील स्मृति आवंटन का उपयोग करके इन सीमाओं से बचा जाता है, जिसमें स्मृति अधिक स्पष्ट रूप से (लेकिन अधिक लचीला) प्रबंधित होती है, सामान्यतः इसे {{citation needed span|''मुक्त संचित'' (अनौपचारिक रूप से "हीप" कहा जाता है),|date=July 2022|reason=In my experience 'heap' is almost exclusively used in a C context. While free store is used in C++ context for the new/delete operators.}} से आवंटित करके, इस उद्देश्य के लिए संरचित स्मृति का एक क्षेत्र है। सी में, हीप पर स्मृति के ब्लॉक को आवंटित करने के लिए लाइब्रेरी फलन<code>मैलोक</code>का उपयोग किया जाता है। क्रमादेश स्मृति के इस ब्लॉक को एक [[सूचक (कंप्यूटर प्रोग्रामिंग)|सूचक]] के माध्यम से अभिगम करता है जो मॉलोक रिटर्न करता है। जब स्मृति की आवश्यकता नहीं रह जाती है,तो सूचक को मुक्त करने के लिए पास किया जाता है जो स्मृति को आवंटन कर देता है ताकि इसे अन्य उद्देश्यों के लिए उपयोग किया जा सके।


सी के मूल विवरण ने संकेत दिया कि <code>calloc</code> और <code>cfree</code> मानक पुस्तकालय में थे, लेकिन नहीं <code>malloc</code>. [[यूनिक्स]] के लिए भंडारण प्रबंधक के सरल मॉडल कार्यान्वयन के लिए कोड दिया गया था <code>alloc</code> और <code>free</code> उपयोगकर्ता इंटरफ़ेस के रूप में कार्य करता है, और का उपयोग कर रहा है <code>[[sbrk]]</code> ऑपरेटिंग सिस्टम से मेमोरी का अनुरोध करने के लिए सिस्टम कॉल।<ref>Brian W. Kernighan, Dennis M. Ritchie, ''The C Programming Language'', Prentice-Hall, 1978; Section 7.9 (page 156) describes <code>calloc</code> and <code>cfree</code>, and Section 8.7 (page 173) describes an implementation for <code>alloc</code> and <code>free</code>.</ref> छठा संस्करण यूनिक्स प्रलेखन देता है <code>alloc</code> और <code>free</code> निम्न-स्तरीय स्मृति आवंटन कार्यों के रूप में।<ref>{{man|3|alloc|v6}}</ref> <code>malloc</code> ई> और <code>free</code> दिनचर्या को उनके आधुनिक रूप में पूरी तरह से 7वें संस्करण यूनिक्स मैनुअल में वर्णित किया गया है।<ref>{{man|3|malloc|v7}}</ref><ref>Anonymous, ''Unix Programmer's Manual, Vol. 1'', Holt Rinehart and Winston, 1983 (copyright held by Bell Telephone Laboratories, 1983, 1979); The <code>man</code> page for <code>malloc</code> etc. is given on page 275.</ref>
सी के मूल विवरण ने संकेत दिया कि कॉलोक और<code>सी मुक्त</code>मानक लाइब्रेरी में थे, लेकिन<code>मॉलोक</code>नहीं थे। [[यूनिक्स]] के लिए भंडारण प्रबंधक के सरल मॉडल कार्यान्वयन के लिए कूट आवंटन के साथ दिया गया था और उपयोगकर्ता अंतरापृष्ठ कार्यों के रूप में मुक्त था, और संचालन प्रणाली से स्मृति का अनुरोध करने के लिए sbrk प्रणाली कॉल का उपयोग कर रहा था।<ref>Brian W. Kernighan, Dennis M. Ritchie, ''The C Programming Language'', Prentice-Hall, 1978; Section 7.9 (page 156) describes <code>calloc</code> and <code>cfree</code>, and Section 8.7 (page 173) describes an implementation for <code>alloc</code> and <code>free</code>.</ref> छठा संस्करण यूनिक्स प्रलेखन आवंटन और मुक्त को निम्न-स्तरीय स्मृति आवंटन कार्यों के रूप में देता है।<ref>{{man|3|alloc|v6}}</ref> उनके आधुनिक रूप में मॉलोक और मुक्त दिनचर्या पूरी तरह से 7वें संस्करण यूनिक्स हस्तचालित में वर्णित हैं।<ref>{{man|3|malloc|v7}}</ref><ref>Anonymous, ''Unix Programmer's Manual, Vol. 1'', Holt Rinehart and Winston, 1983 (copyright held by Bell Telephone Laboratories, 1983, 1979); The <code>man</code> page for <code>malloc</code> etc. is given on page 275.</ref>
कुछ प्लेटफॉर्म पुस्तकालय या आंतरिक फ़ंक्शन कॉल प्रदान करते हैं जो हीप के बजाय सी स्टैक से रन-टाइम डायनेमिक आवंटन की अनुमति देते हैं (उदा। <code>alloca()</code><ref>{{man|3|alloca|FreeBSD}}
 
</ref>). कॉलिंग फ़ंक्शन समाप्त होने पर यह मेमोरी स्वचालित रूप से मुक्त हो जाती है।
कुछ प्लेटफॉर्म लाइब्रेरी या आंतरिक फलन कॉल प्रदान करते हैं जो हीप (जैसे<code>alloca())</code><ref>{{man|3|alloca|FreeBSD}}
</ref>के बदले सी स्टैक से कार्यावधि गतिशील आवंटन की अनुमति देते हैं। कॉलिंग कार्य समाप्त होने पर यह स्मृति स्वचालित रूप से मुक्त हो जाती है।


== कार्यों का अवलोकन ==
== कार्यों का अवलोकन ==
सी डायनेमिक मेमोरी आवंटन कार्यों को परिभाषित किया गया है <code>stdlib.h</code> हेडर (<code>cstdlib</code> सी ++ में हेडर)<ref name="c99" />
सी गतिशील स्मृति आवंटन कार्यों को <code>stdlib.h</code> हेडर (<code>cstdlib</code> सी ++ में हेडर) में परिभाषित किया गया है।<ref name="c99" />


{| class="wikitable"
{| class="wikitable"
|-
|-
! Function
!कार्य
! Description
!विवरण
|-
|-
| {{anchor|malloc}}{{cpp|malloc}}
| {{anchor|malloc}}{{cpp|malloc}}
| allocates the specified number of bytes
|बाइट्स की निर्दिष्ट संख्या आवंटित करता है
|-
|-
| {{anchor|aligned_alloc}}{{cpp|aligned_alloc}}
| {{anchor|aligned_alloc}}{{cpp|aligned_alloc}}
| allocates the specified number of bytes at the specified allignment
|निर्दिष्ट संरेखण पर बाइट्स की निर्दिष्ट संख्या आवंटित करता है
|-
|-
| {{anchor|realloc}}{{cpp|realloc}}
| {{anchor|realloc}}{{cpp|realloc}}
| increases or decreases the size of the specified block of memory, moving it if necessary
|स्मृति के निर्दिष्ट ब्लॉक के आकार को बढ़ाता या घटाता है, यदि आवश्यक हो तो इसे स्थानांतरित करता है
|-
|-
| {{anchor|calloc}}{{cpp|calloc}}
| {{anchor|calloc}}{{cpp|calloc}}
| allocates the specified number of bytes and initializes them to zero
|बाइट्स की निर्दिष्ट संख्या आवंटित करता है और उन्हें शून्य से प्रारंभ करता है
|-
|-
| {{anchor|free}}{{cpp|free}}
| {{anchor|free}}{{cpp|free}}
| releases the specified block of memory back to the system
|स्मृति के निर्दिष्ट ब्लॉक को प्रणाली में वापस मुक्त करता है
|}
|}


=== के बीच अंतर <code>malloc()</code> और <code>calloc()</code>===
=== <code>malloc()</code> और <code>calloc() के मध्य अंतर</code>===
* <code>malloc()</code> एक तर्क लेता है (बाइट्स में आवंटित करने के लिए स्मृति की मात्रा), जबकि <code>calloc()</code> दो तर्क लेता है - तत्वों की संख्या और प्रत्येक तत्व का आकार।
* <code>malloc()</code> एक तर्क लेता है (बाइट्स में आवंटित करने के लिए स्मृति की मात्रा), जबकि<code>calloc()</code> दो तर्क लेता है - तत्वों की संख्या और प्रत्येक तत्व का आकार।
* <code>malloc()</code> केवल मेमोरी आवंटित करता है, जबकि <code>calloc()</code> आवंटित क्षेत्र में बाइट को आवंटित और शून्य पर सेट करता है।<ref>{{man|3|calloc|Linux}}</ref>
* <code>malloc()</code> केवल स्मृति आवंटित करता है, जबकि<code>calloc()</code>आवंटित क्षेत्र में बाइट को आवंटित और शून्य पर समुच्चय करता है।<ref>{{man|3|calloc|Linux}}</ref>
== उपयोग उदाहरण ==
== उपयोग उदाहरण ==
स्वत: गुंजाइश के साथ दस पूर्णांकों की एक [[सरणी डेटा संरचना]] बनाना सी में सीधा है:
स्वत: विस्तार के साथ दस पूर्णांकों की एक [[सरणी डेटा संरचना|सरणी]] बनाना सी में सीधा है:
<वाक्यविन्यास प्रकाश लैंग = सी>
 
इंट सरणी [10];
<code>int array[10];</code>                                                                                                                                
</वाक्यविन्यास हाइलाइट>
 
तथापि, संकलन समय पर सरणी का आकार तय किया गया है। यदि कोई चर-लंबाई_अरे का उपयोग किए बिना एक समान सरणी को गतिशील रूप से आवंटित करना चाहता है, जो सभी C11 (C मानक संशोधन) कार्यान्वयन में समर्थित होने की गारंटी नहीं है, तो निम्न कोड का उपयोग किया जा सकता है:
तथापि, संकलन समय पर सरणी का आकार तय किया गया है। यदि कोई चर-लंबाई_अरे का उपयोग किए बिना एक समान सरणी को गतिशील रूप से आवंटित करना चाहता है, जो सभी C11 कार्यान्वयनों में समर्थित होने की गारंटित नहीं है, तो निम्न कूट का उपयोग किया जा सकता है:
<वाक्यविन्यास प्रकाश लैंग = सी>
int *सरणी = malloc(10 * sizeof(int));
</वाक्यविन्यास हाइलाइट>
यह बाइट्स की संख्या की गणना करता है जो स्मृति में दस पूर्णांकों पर कब्जा कर लेता है, फिर अनुरोध करता है कि कई बाइट्स से <code>malloc</code> और नाम के एक पॉइंटर (कंप्यूटर प्रोग्रामिंग) को रिजल्ट असाइन करता है <code>array</code> (सी सिंटैक्स के कारण, कुछ स्थितियों में पॉइंटर्स और सरणियों का परस्पर उपयोग किया जा सकता है)।


क्योंकि <code>malloc</code> अनुरोध की सेवा करने में सक्षम नहीं हो सकता है, यह एक शून्य सूचक लौटा सकता है और यह इसकी जांच करने के लिए सर्वोत्तम प्रथाओं को कोडिंग कर रहा है:
<code>int *array = malloc(10 * sizeof(int));</code>  
<वाक्यविन्यास प्रकाश लैंग = सी>
int *सरणी = malloc(10 * sizeof(int));
अगर (सरणी == न्यूल) {
  fprintf (stderr, malloc विफल \ n);
  वापसी -1;
}
</वाक्यविन्यास हाइलाइट>
जब प्रोग्राम को [[गतिशील सरणी]] की आवश्यकता नहीं होती है, तो उसे अंततः कॉल करना चाहिए <code>free</code> उस मेमोरी को वापस करने के लिए जो फ्री स्टोर में रहती है:
<वाक्यविन्यास प्रकाश लैंग = सी>
मुक्त (सरणी);
</वाक्यविन्यास हाइलाइट>


स्मृति द्वारा अलग रखा गया <code>malloc</code> इनिशियलाइज़ेशन (प्रोग्रामिंग) नहीं है और इसमें [[cruft]] हो सकता है: पहले उपयोग किए गए और छोड़े गए डेटा के अवशेष। के साथ आवंटन के बाद <code>malloc</code>, सरणी के तत्व [[अप्रारंभीकृत चर]] हैं। आदेश <code>calloc</code> एक आवंटन लौटाएगा जो पहले ही साफ हो चुका है:
यह उन बाइट्स की संख्या की गणना करता है जो दस पूर्णांक स्मृति में कब्जा कर लेते है, फिर अनुरोध करते है कि<code>malloc</code>से कई बाइट्स और परिणाम को<code>array</code>नामक सूचक को निर्धारित करें (सी वाक्य रचना के कारण, कुछ स्थितियों में संकेतक और सरणियों का उपयोग एक दूसरे के रूप में किया जा सकता है)
<वाक्यविन्यास प्रकाश लैंग = सी>
int * सरणी = कॉलोक (10, आकार (int));
</वाक्यविन्यास हाइलाइट>


रीयलोक के साथ हम एक पॉइंटर पॉइंट की मेमोरी की मात्रा का आकार बदल सकते हैं। उदाहरण के लिए, यदि हमारे पास आकार की सरणी के रूप में कार्य करने वाला सूचक है <math>n</math> और हम इसे आकार की एक सरणी में बदलना चाहते हैं <math>m</math>, हम realloc का उपयोग कर सकते हैं।
क्योंकि<code>malloc</code>अनुरोध को पूरा करने में सक्षम नहीं हो सकते है, यह एक शून्य सूचक लौटा सकते है और यह जांचने के लिए अच्छा क्रमादेशन अभ्यास है:
<वाक्यविन्यास प्रकाश लैंग = सी>
int *array = malloc(10 * sizeof(int));
int *arr = malloc(2 * sizeof(int));
if (array == NULL) {
आगमन [0] = 1;
  fprintf(stderr, "malloc failed\n");
आगमन [1] = 2;
  return -1;
arr = realloc (arr, 3 * sizeof (int));
}
आगमन [2] = 3;
जब क्रमादेश को [[गतिशील सरणी]] की आवश्यकता नहीं होती है, तो उसे मुक्त संग्रह ग्रहण करने वाली स्मृति को वापस करने के लिए कॉल मुक्त करना होगा:
</वाक्यविन्यास हाइलाइट>
ध्यान दें कि realloc को ब्लॉक का आधार पता बदलना चाहिए (यानी यदि यह मूल ब्लॉक के आकार को बढ़ाने में विफल रहा है, और इसलिए कहीं और एक नया बड़ा ब्लॉक आवंटित किया है और इसमें पुरानी सामग्री की प्रतिलिपि बनाई है)। इसलिए, मूल ब्लॉक के भीतर पतों के लिए कोई संकेतक भी अब मान्य नहीं हैं।


== प्रकार सुरक्षा ==
<code>free(array);</code>                                                                                                                                        
<code>malloc</code> एक [[शून्य सूचक]] लौटाता है (<code>void *</code>), जो इंगित करता है कि यह अज्ञात डेटा प्रकार के क्षेत्र के लिए सूचक है। मजबूत प्रकार की प्रणाली के कारण सी ++ में कास्टिंग का उपयोग आवश्यक है, जबकि सी में ऐसा नहीं है। कोई इस सूचक को एक विशिष्ट प्रकार के लिए कास्ट कर सकता है ([[प्रकार रूपांतरण]] देखें):


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


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


=== कास्ट करने के फायदे ===
=== संचक करने के लाभ ===
* कलाकारों को सम्मिलित करने से सी प्रोग्राम या फ़ंक्शन को सी ++ के रूप में संकलित करने की अनुमति मिल सकती है।
* संचक को सम्मिलित करने से सी क्रमादेश या फलन को C++ के रूप में संकलित करने की अनुमति मिल सकती है।
* कास्ट [[ANSI C]]|पूर्व-1989 संस्करणों के लिए अनुमति देता है <code>malloc</code> वह मूल रूप से एक लौटा <code>char *</code>.<ref name="Cprog_malloc">{{cite web |url=http://faq.cprogramming.com/cgi-bin/smartfaq.cgi?id=1043284351&answer=1047673478 |title=कास्टिंग मॉलोक|publisher=Cprogramming.com |access-date=9 March 2007 }}</रेफरी>
* संचक<code>malloc</code>के 1989 के पूर्व के संस्करणों के लिए अनुमति देता है जो मूल रूप से एक<code>char*</code>देता है।<ref name="Cprog_malloc">{{cite web |url=http://faq.cprogramming.com/cgi-bin/smartfaq.cgi?id=1043284351&answer=1047673478 |title=कास्टिंग मॉलोक|publisher=Cprogramming.com |access-date=9 March 2007 }}</रेफरी>
* कास्टिंग से डेवलपर को प्रकार के आकार में विसंगतियों की पहचान करने में मदद मिल सकती है, यदि गंतव्य सूचक प्रकार में परिवर्तन होता है, खासकर यदि सूचक को दूर घोषित किया गया हो <code>malloc()</code> कॉल (हालांकि आधुनिक संकलक और स्थिर विश्लेषक कलाकारों की आवश्यकता के बिना इस तरह के व्यवहार पर चेतावनी दे सकते हैं<ref>{{cite web|url=http://clang.llvm.org/doxygen/MallocSizeofChecker_8cpp_source.html|title=clang: lib/StaticAnalyzer/Checkers/MallocSizeofChecker.cpp Source File|website=clang.llvm.org|access-date=1 April 2018}}</ref>).
*कास्टिंग से डेवलपर को प्रकार के आकार में विसंगतियों की पहचान करने में मदद मिल सकती है, यदि गंतव्य सूचक प्रकार में परिवर्तन होता है, खासकर यदि सूचक को दूर घोषित किया गया हो <code>malloc()</code> कॉल (हालांकि आधुनिक संकलक और स्थिर विश्लेषक कलाकारों की आवश्यकता के बिना इस तरह के व्यवहार पर चेतावनी दे सकते हैं<nowiki><ref></nowiki>{{cite web|url=http://clang.llvm.org/doxygen/MallocSizeofChecker_8cpp_source.html|title=clang: lib/StaticAnalyzer/Checkers/MallocSizeofChecker.cpp Source File|website=clang.llvm.org|access-date=1 April 2018}}</ref>
*संचकन से विकासक को प्रकार के आकार में विसंगतियों की पहचान करने में सहायता मिल सकती है, विशेष रूप से अगर सूचक को<code>malloc()</code>कॉल से दूर घोषित किया जाता है (यद्यपि आधुनिक संकलक और स्थिर विश्लेषक संचक की आवश्यकता के बिना इस तरह के व्यवहार पर चेतावनी दे सकते हैं)।


=== कास्टिंग करने के नुकसान ===
=== संचकन करने के नुकसान ===
* सी मानक के तहत, कास्ट बेमानी है।
* सी मानक के अंतर्गत, संचक अनावश्यक है।
* कास्ट जोड़ने से शीर्षलेख सम्मिलित करने में विफल हो सकता है <code>stdlib.h</code>, जिसमें [[फ़ंक्शन प्रोटोटाइप]] के लिए <code>malloc</code> पाया जाता है।<ref name="Cprog_malloc" /><ref>{{cite web |url=http://www.c-faq.com/malloc/mallocnocast.html |title=comp.lang.c FAQ list · Question 7.7b |publisher=C-FAQ |access-date=9 March 2007 }}</ref> के लिए एक प्रोटोटाइप के अभाव में <code>malloc</code>, C90 मानक के लिए आवश्यक है कि C कंपाइलर मान ले <code>malloc</code> एक देता है <code>int</code>. यदि कोई कास्ट नहीं है, तो C90 को डायग्नोस्टिक की आवश्यकता होती है जब यह पूर्णांक पॉइंटर को सौंपा जाता है; तथापि, कलाकारों के साथ, इस निदान का उत्पादन नहीं किया जाएगा, एक बग को छिपाते हुए। कुछ आर्किटेक्चर और डेटा मॉडल पर (जैसे 64-बिट सिस्टम पर LP64, जहां <code>long</code> और पॉइंटर्स 64-बिट हैं और <code>int</code> 32-बिट है), यह त्रुटि वास्तव में अपरिभाषित व्यवहार का परिणाम हो सकती है, जैसा कि स्पष्ट रूप से घोषित किया गया है <code>malloc</code> 32-बिट मान लौटाता है जबकि वास्तव में परिभाषित फ़ंक्शन 64-बिट मान लौटाता है। कॉलिंग कन्वेंशन और मेमोरी लेआउट के आधार पर, इसका परिणाम [[ढेर तोड़ना]] हो सकता है। आधुनिक कंपाइलरों में इस मुद्दे पर किसी का ध्यान नहीं जाने की संभावना कम है, क्योंकि C99 निहित घोषणाओं की अनुमति नहीं देता है, इसलिए कंपाइलर को डायग्नोस्टिक का उत्पादन करना चाहिए, भले ही वह मान ले <code>int</code> वापस करना।
* संचक जोड़ने से हेडर<code>stdlib.h</code>को सम्मिलित करने में विफल हो सकते है, जिसमें<code>malloc</code>के लिए [[फ़ंक्शन प्रोटोटाइप|फलन आदिप्ररूप]] पाया जाता है।<ref name="Cprog_malloc" /><ref>{{cite web |url=http://www.c-faq.com/malloc/mallocnocast.html |title=comp.lang.c FAQ list · Question 7.7b |publisher=C-FAQ |access-date=9 March 2007 }}</ref><code>malloc</code>के लिए एक आदिप्ररूप की अनुपस्थिति में, C90 मानक के लिए आवश्यक है कि सी संकलक मानता है कि<code>malloc</code>एक<code>int</code>देता है। यदि कोई संचक नहीं है, तो C90 को नैदानिक की आवश्यकता होती है जब यह पूर्णांक सूचक को निर्दिष्‍ट किया जाता है; तथापि, संचक के साथ, इस निदान का उत्पादन नहीं किया जाएगा, एक बग को छिपाते हुए। कुछ वास्तुकला और डेटा मॉडल पर (जैसे 64-बिट प्रणाली पर LP64, जहां<code>long</code>और सूचक्स 64-बिट हैं और<code>int</code> 32-बिट है), यह त्रुटि वास्तव में अपरिभाषित व्यवहार का परिणाम हो सकती है, क्योंकि निहित रूप से घोषित<code>malloc</code>32- रिटर्न देती है। बिट मान जबकि वास्तव में परिभाषित फलन 64-बिट मान लौटाता है। कॉलिंग सम्मेलन और स्मृति लेआउट के आधार पर, इसका परिणाम [[ढेर तोड़ना|स्टैक उत्तम]] हो सकता है। आधुनिक संकलकों में इस मुद्दे पर किसी का ध्यान नहीं जाने की संभावना कम है, क्योंकि C99 निहित घोषणाओं की अनुमति नहीं देता है, इसलिए संकलक को निदान का उत्पादन करना चाहिए, भले ही वह<code>int</code>रिटर्न मान ले।
* यदि इसकी घोषणा पर सूचक का प्रकार बदल दिया गया है, तो किसी को भी सभी पंक्तियों को बदलने की आवश्यकता हो सकती है <code>malloc</code> बुलाया और डाला जाता है।
* यदि इसकी घोषणा पर सूचक का प्रकार बदल दिया गया है, तो किसी को भी सभी पंक्तियों को बदलने की आवश्यकता हो सकती है जहां<code>malloc</code>को संबोधित और संचक किया जाता है।


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


सबसे आम त्रुटियां इस प्रकार हैं:<ref>{{Cite book|title=Pointers on C|last=Reek|first=Kenneth|date=1997-08-04|publisher=Pearson|isbn=9780673999863|edition=1|language=en}}</ref>
सबसे सामान्य त्रुटियां इस प्रकार हैं:<ref>{{Cite book|title=Pointers on C|last=Reek|first=Kenneth|date=1997-08-04|publisher=Pearson|isbn=9780673999863|edition=1|language=en}}</ref>
आवंटन विफलताओं की जांच नहीं करना: स्मृति आवंटन सफल होने की गारंटी नहीं है, और इसके बजाय एक शून्य सूचक लौटा सकता है। यदि आबंटन सफल है, तो जाँच किए बिना दिए गए मान का उपयोग करना, [[अपरिभाषित व्यवहार]] को आमंत्रित करता है। यह सामान्यतः दुर्घटना की ओर जाता है (नल पॉइंटर डिरेफरेंस पर परिणामी विभाजन दोष के कारण), लेकिन इस बात की कोई गारंटी नहीं है कि क्रैश होगा इसलिए उस पर भरोसा करने से भी समस्याएँ हो सकती हैं।
मेमोरी लीक: मेमोरी का उपयोग करने में विफलता <code>free</code> गैर-पुन: प्रयोज्य मेमोरी का निर्माण होता है, जो अब प्रोग्राम द्वारा उपयोग नहीं किया जाता है। यह स्मृति संसाधनों को बर्बाद करता है और इन संसाधनों के समाप्त होने पर आवंटन विफल हो सकता है। {{anchor|Use after free}}
तार्किक त्रुटियां: सभी आवंटनों को एक ही पैटर्न का पालन करना चाहिए: आवंटन का उपयोग करना <code>malloc</code>, डेटा स्टोर करने के लिए उपयोग, डीलोकेशन का उपयोग करना <code>free</code>. इस पैटर्न का पालन करने में विफलता, जैसे कॉल करने के बाद मेमोरी उपयोग <code>free</code> (झूलने वाला सूचक) या कॉल करने से पहले <code>malloc</code> ([[जंगली सूचक]]), बुला रहा है <code>free</code> दो बार (डबल फ्री), आदि, सामान्यतः एक विभाजन दोष का कारण बनता है और प्रोग्राम के क्रैश होने का परिणाम होता है। ये त्रुटियां क्षणिक और डिबग करने में कठिन हो सकती हैं - उदाहरण के लिए, मुक्त मेमोरी को सामान्यतः OS द्वारा तुरंत पुनः प्राप्त नहीं किया जाता है, और इस प्रकार लटकने वाले पॉइंटर्स थोड़ी देर के लिए बने रह सकते हैं और काम करने लगते हैं।


इसके अलावा, एएनएसआई सी मानकीकरण से पहले एक इंटरफ़ेस के रूप में, {{code|malloc}} और इसके संबंधित कार्यों में ऐसे व्यवहार होते हैं जिन्हें जानबूझकर स्वयं के लिए परिभाषित करने के लिए कार्यान्वयन के लिए छोड़ दिया गया था। उनमें से एक शून्य-लंबाई आवंटन है, जो कि अधिक समस्या है {{code|realloc}} चूंकि शून्य का आकार बदलना अधिक सामान्य है।<ref>{{cite web |title=MEM04-C. Beware of zero-length allocations - SEI CERT C Coding Standard - Confluence |url=https://wiki.sei.cmu.edu/confluence/display/c/MEM04-C.+Beware+of+zero-length+allocations |website=wiki.sei.cmu.edu}}<!-- Note: the example is bullshit. Freeing NULL is safe because it does nothing. --></ref> हालाँकि [[POSIX]] और सिंगल यूनिक्स विशिष्टता दोनों को वापस लौटकर 0-आकार के आवंटन के उचित प्रबंधन की आवश्यकता होती है {{code|NULL}} या कुछ और जिसे सुरक्षित रूप से मुक्त किया जा सकता है,<ref>{{cite web |title=POSIX.1-2017: malloc |url=https://pubs.opengroup.org/onlinepubs/9699919799/ |website=pubs.opengroup.org |access-date=29 November 2019}}</ref> सभी प्लेटफॉर्म के लिए इन नियमों का पालन करना आवश्यक नहीं है। इसके कारण होने वाली कई डबल-फ्री त्रुटियों में, 2019 [[व्हाट्सप्प]] आरसीई विशेष रूप से प्रमुख था।<ref>{{cite web |last1=Awakened |title=How a double-free bug in WhatsApp turns to RCE |date=2 October 2019 |url=https://awakened1712.github.io/hacking/hacking-whatsapp-gif-rce/ |access-date=29 November 2019}}</ref> इन कार्यों को लपेटने का एक तरीका उन्हें सुरक्षित बनाने के लिए केवल 0-आकार के आवंटन की जाँच करना और उन्हें आकार 1 में बदलना है। (रिटर्निंग) {{code|NULL}} इसकी अपनी समस्याएँ हैं: यह अन्यथा एक आउट-ऑफ़-मेमोरी विफलता का संकेत देता है। के मामले में {{code|realloc}} यह संकेत देगा कि मूल स्मृति को स्थानांतरित और मुक्त नहीं किया गया था, जो फिर से आकार 0 के मामले में नहीं है, जिससे डबल-फ्री हो जाता है।)<ref>{{cite tweet |last1=Felker |first1=Rich |title=Wow. The WhatsApp RCE was the wrong behavior for realloc(p,0) so many implementations insist on. |user=RichFelker |number=1179701167569416192 |access-date=6 August 2022 |date=3 October 2019}}</ref>
==== आवंटन विफलताओं की जांच नहीं करना: ====
स्मृति आवंटन सफल होने की गारंटित नहीं है, और इसके बदले एक शून्य सूचक प्रतिगमन कर सकता है। यदि आबंटन सफल है, तो जाँच किए बिना दिए गए मान का उपयोग करना, [[अपरिभाषित व्यवहार]] को आमंत्रित करता है। यह सामान्यतः दुर्घटना की ओर जाता है (नल सूचक विचलन पर परिणामी विभाजन दोष के कारण), लेकिन इस बात की कोई गारंटित नहीं है कि क्रैश होगा इसलिए उस पर भरोसा करने से भी समस्याएँ हो सकती हैं।
 
==== स्मृति रिसाव: ====
नि: शुल्क का उपयोग करके स्मृति को हटाने में विफलता गैर-पुन: प्रयोज्य स्मृति का निर्माण करती है, जो अब क्रमादेश द्वारा उपयोग नहीं की जाती है। यह स्मृति संसाधनों को असफल करती है और इन संसाधनों के समाप्त होने पर आवंटन विफल हो सकता है।
 
==== तार्किक त्रुटियां: ====
सभी आवंटनों को एक ही प्रतिरूप का पालन करना चाहिए: <code>malloc</code>का उपयोग करके आवंटन, डेटा संग्रह करने के लिए उपयोग, नि: शुल्क का उपयोग करके पुनःआवंटन करना है। इस प्रतिरूप का पालन करने में विफलता, जैसे नि: शुल्क कॉल के बाद स्मृति उपयोग (झूलने वाला सूचक) <code>malloc</code>([[जंगली सूचक]]) पर कॉल करने से पहले, दो बार<code>free</code>कॉल करना (दोगुना मुक्त), आदि, सामान्यतः एक विभाजन दोष का कारण बनता है और क्रमादेश के क्रैश होने का परिणाम होता है। ये त्रुटियां क्षणिक और डिबग करने में कठिन हो सकती हैं - उदाहरण के लिए, मुक्त स्मृति को सामान्यतः OS द्वारा तुरंत पुनः प्राप्त नहीं किया जाता है, और इस प्रकार निलंबित संकेत थोड़ी देर के लिए बने रह सकते हैं और काम करने लगते हैं।
 
इसके अतिरिक्त, एएनएसआई सी मानकीकरण से पहले एक अंतरापृष्ठ के रूप में, {{code|malloc}}और इसके संबंधित कार्यों में ऐसे व्यवहार होते हैं जिन्हें जानबूझकर स्वयं के लिए परिभाषित करने के लिए कार्यान्वयन के लिए छोड़ दिया गया था। उनमें से एक शून्य-लंबाई आवंटन है, जो कि{{code|realloc}}के साथ अधिक समस्या है क्योंकि यह शून्य का आकार बदलने के लिए अधिक सामान्य है।<ref>{{cite web |title=MEM04-C. Beware of zero-length allocations - SEI CERT C Coding Standard - Confluence |url=https://wiki.sei.cmu.edu/confluence/display/c/MEM04-C.+Beware+of+zero-length+allocations |website=wiki.sei.cmu.edu}}<!-- Note: the example is bullshit. Freeing NULL is safe because it does nothing. --></ref> यद्यपि [[POSIX]] और ऐकल यूनिक्स विशिष्टता दोनों को 0-आकार के आवंटन के उचित संचालन की आवश्यकता होती है, या तो{{code|NULL}}या कुछ और जो सुरक्षित रूप से मुक्त किया जा सकता है,<ref>{{cite web |title=POSIX.1-2017: malloc |url=https://pubs.opengroup.org/onlinepubs/9699919799/ |website=pubs.opengroup.org |access-date=29 November 2019}}</ref> इन नियमों का पालन करने के लिए सभी प्लेटफार्मों की आवश्यकता नहीं है। इसके कारण होने वाली कई दोगुनी-मुक्त त्रुटियों में, 2019 [[व्हाट्सप्प]] आरसीई विशेष रूप से प्रमुख था।<ref>{{cite web |last1=Awakened |title=How a double-free bug in WhatsApp turns to RCE |date=2 October 2019 |url=https://awakened1712.github.io/hacking/hacking-whatsapp-gif-rce/ |access-date=29 November 2019}}</ref> इन कार्यों को आवृत की एक शैली उन्हें सुरक्षित बनाने के लिए केवल 0-आकार के आवंटन की जाँच करना और उन्हें आकार 1 में बदलना है। (रिटर्निंग) {{code|NULL}}इसकी अपनी समस्याएँ हैं: यह अन्यथा एक स्मृति से बाहर विफलता का संकेत देता है। {{code|realloc}}के प्रकरण में यह संकेत होगा कि मूल स्मृति को स्थानांतरित नहीं किया गया था और मुक्त नहीं किया गया था, जो फिर से आकार 0 के प्रकरण में नहीं है, जिससे दोगुना-मुक्त हो जाता है।)<ref>{{cite tweet |last1=Felker |first1=Rich |title=Wow. The WhatsApp RCE was the wrong behavior for realloc(p,0) so many implementations insist on. |user=RichFelker |number=1179701167569416192 |access-date=6 August 2022 |date=3 October 2019}}</ref>
== कार्यान्वयन ==
== कार्यान्वयन ==
स्मृति प्रबंधन का कार्यान्वयन काफी हद तक ऑपरेटिंग सिस्टम और आर्किटेक्चर पर निर्भर करता है। कुछ ऑपरेटिंग सिस्टम मॉलोक के लिए आवंटक की आपूर्ति करते हैं, जबकि अन्य डेटा के कुछ क्षेत्रों को नियंत्रित करने के लिए कार्यों की आपूर्ति करते हैं। एक ही डायनेमिक मेमोरी एलोकेटर का उपयोग अक्सर दोनों को लागू करने के लिए किया जाता है <code>malloc</code> और संचालिका <code>new</code> सी ++ में।<ref>{{Cite book |title=Modern C++ Design: Generic Programming and Design Patterns Applied |first=Andrei |last=Alexandrescu |publisher=Addison-Wesley |year=2001 |page=78}}</ref>
स्मृति प्रबंधन का कार्यान्वयन काफी हद तक संचालन प्रणाली और वास्तुकला पर निर्भर करता है। कुछ संचालन प्रणाली मॉलोक के लिए आवंटक की आपूर्ति करते हैं, जबकि अन्य डेटा के कुछ क्षेत्रों को नियंत्रित करने के लिए कार्यों की आपूर्ति करते हैं। एक ही गतिशील स्मृति संभाजक का उपयोग प्रायः<code>malloc</code>और संचालक दोनों को C++ में लागू करने के लिए किया जाता है।<ref>{{Cite book |title=Modern C++ Design: Generic Programming and Design Patterns Applied |first=Andrei |last=Alexandrescu |publisher=Addison-Wesley |year=2001 |page=78}}</ref>
=== हीप-आधारित ===
=== हीप-आधारित ===
{{see also|sbrk}}
{{see also|sbrk}}
एलोकेटर का कार्यान्वयन सामान्यतः [[ढेर स्मृति]] या [[डेटा खंड]] का उपयोग करके किया जाता है। आवंटक सामान्यतः आवंटन अनुरोधों को पूरा करने के लिए ढेर का विस्तार और अनुबंध करेगा।
संभाजक का कार्यान्वयन सामान्यतः [[ढेर स्मृति|हीप स्मृति]] या [[डेटा खंड]] का उपयोग करके किया जाता है। आवंटक सामान्यतः आवंटन अनुरोधों को पूरा करने के लिए हीप का विस्तार और अनुबंध करता है।


ढेर विधि कुछ अंतर्निहित खामियों से ग्रस्त है, जो पूरी तरह से [[विखंडन (कंप्यूटर)]] से उपजी है। स्मृति आबंटन की किसी भी विधि की तरह, हीप खंडित हो जाएगा; यानी, ढेर पर आवंटित स्थान में प्रयुक्त और अप्रयुक्त स्मृति के खंड होंगे। ढेर का विस्तार करने का सहारा लेने से पहले एक अच्छा आवंटक उपयोग करने के लिए पहले से आवंटित स्मृति के अप्रयुक्त क्षेत्र को खोजने का प्रयास करेगा। इस पद्धति के साथ प्रमुख समस्या यह है कि हीप में केवल दो महत्वपूर्ण विशेषताएं हैं: आधार, या वर्चुअल मेमोरी स्पेस में हीप की शुरुआत; और लंबाई, या इसका आकार। हीप को अपनी पूरी लंबाई भरने के लिए पर्याप्त सिस्टम मेमोरी की आवश्यकता होती है, और इसका आधार कभी नहीं बदल सकता। इस प्रकार, अप्रयुक्त मेमोरी का कोई भी बड़ा क्षेत्र बर्बाद हो जाता है। ढेर इस स्थिति में फंस सकता है यदि ढेर के अंत में एक छोटा सा इस्तेमाल किया गया खंड मौजूद है, जो किसी भी पते की जगह को बर्बाद कर सकता है। आलसी मेमोरी आवंटन योजनाओं पर, जैसे कि अक्सर लिनक्स ऑपरेटिंग सिस्टम में पाए जाते हैं, एक बड़ा हीप अनिवार्य रूप से समकक्ष सिस्टम मेमोरी को आरक्षित नहीं करता है; यह केवल पहली बार लिखने के समय ही ऐसा करेगा (गैर-मैप किए गए मेमोरी पेज शून्य पर लौटते हैं)। इसकी ग्रैन्युलैरिटी पृष्ठ आकार पर निर्भर करती है।
हीप विधि कुछ अंतर्निहित दोषों से ग्रस्त है, जो पूरी तरह से [[विखंडन (कंप्यूटर)|विखंडन]] से उत्पन्न है। स्मृति आबंटन की किसी भी विधि की तरह, हीप खंडित हो जाएगी; अर्थात्, हीप पर आवंटित स्थान में प्रयुक्त और अप्रयुक्त स्मृति के खंड होंगे। हीप का विस्तार करने का सहारा लेने से पहले एक अच्छा आवंटक उपयोग करने के लिए पहले से आवंटित स्मृति के अप्रयुक्त क्षेत्र को खोजने का प्रयास करेगा। इस पद्धति के साथ प्रमुख समस्या यह है कि हीप में केवल दो महत्वपूर्ण विशेषताएं हैं: आधार, या आभासी स्मृति स्पेस में हीप का आरंभ; और लंबाई, या इसका आकार। हीप को अपनी पूरी लंबाई भरने के लिए पर्याप्त प्रणाली स्मृति की आवश्यकता होती है, और इसका आधार कभी नहीं बदल सकता है। इस प्रकार, अप्रयुक्त स्मृति का कोई भी बड़ा क्षेत्र व्यर्थ हो जाता है। हीप इस स्थिति में "अटक" सकता है यदि हीप के अंत में एक छोटा प्रयुक्त खंड अस्तित्व है, जो पता स्थान की किसी भी राशि को व्यर्थ कर सकता है। अक्रिय स्मृति आवंटन योजनाओं पर, जैसे कि प्रायः लिनक्स संचालन प्रणाली में पाए जाते हैं, एक बड़ा हीप अनिवार्य रूप से समकक्ष प्रणाली स्मृति को प्रतिबंध नहीं करता है; यह केवल पहली बार लिखने के समय ही ऐसा करेगा (गैर-मैप किए गए स्मृति पृष्ठ शून्य पर लौटते हैं)। इसकी ग्रैन्युलैरिटी पृष्ठ आकार पर निर्भर करती है।
===dlmalloc और ptmalloc{{anchor|dlmalloc}}===
===डीएलमॉलोक और पीटीमॉलोक===
डग ली ने सार्वजनिक डोमेन dlmalloc ([[Doug Lea]]'s malloc) को एक सामान्य-उद्देश्य आवंटक के रूप में विकसित किया है, जिसकी शुरुआत 1987 में हुई थी। GNU C लाइब्रेरी (glibc) वोल्फ्राम ग्लोगर के ptmalloc (pthreads malloc) से ली गई है, जो थ्रेडिंग से संबंधित dlmalloc का एक कांटा है। सुधार।<ref>{{cite web|url=http://malloc.de/en/|title=Wolfram Gloger's malloc homepage|website=malloc.de|access-date=1 April 2018}}</ref><ref name="phrack-57-8">{{cite journal|last=Kaempf |first=Michel |year=2001 |title=Vudo malloc tricks |journal=[[Phrack]] |issue=57 |page=8 |url=http://phrack.org/issues/57/8.html |access-date=29 April 2009 |url-status=live |archive-url=https://web.archive.org/web/20090122071923/http://www.phrack.org/issues.html?issue=57&id=8&mode=txt |archive-date=22 January 2009 }}</ref><ref>{{cite web |title=Glibc: Malloc Internals |url=https://sourceware.org/glibc/wiki/MallocInternals |website=sourceware.org Trac |access-date=1 December 2019}}</ref> नवंबर 2019 तक, dlmalloc का नवीनतम संस्करण अगस्त 2012 से संस्करण 2.8.6 है।<ref name="dlmalloc">{{cite web |last1=Lee |first1=Doug |title=A Memory Allocator |url=http://gee.cs.oswego.edu/dl/html/malloc.html |access-date=1 December 2019}} [http://gee.cs.oswego.edu/pub/misc/malloc.c HTTP for Source Code]</ref>
डौग ली ने 1987 में प्रारम्भ होने वाले एक सामान्य-उद्देश्य आवंटक के रूप में सार्वजनिक डोमेन डीएलमॉलोक ("डौग ली का मॉलोक") विकसित किया है। GNU C लाइब्रेरी (glibc) वोल्फ्राम ग्लोगर के पीटीमॉलोक (pthreads malloc) से ली गई है, जो थ्रेडिंग से संबंधित डीएलमॉलोक का एक द्विशाख है।<ref>{{cite web|url=http://malloc.de/en/|title=Wolfram Gloger's malloc homepage|website=malloc.de|access-date=1 April 2018}}</ref><ref name="phrack-57-8">{{cite journal|last=Kaempf |first=Michel |year=2001 |title=Vudo malloc tricks |journal=[[Phrack]] |issue=57 |page=8 |url=http://phrack.org/issues/57/8.html |access-date=29 April 2009 |url-status=live |archive-url=https://web.archive.org/web/20090122071923/http://www.phrack.org/issues.html?issue=57&id=8&mode=txt |archive-date=22 January 2009 }}</ref><ref>{{cite web |title=Glibc: Malloc Internals |url=https://sourceware.org/glibc/wiki/MallocInternals |website=sourceware.org Trac |access-date=1 December 2019}}</ref> नवंबर 2019 तक, डीएलमॉलोक का नवीनतम संस्करण अगस्त 2012 से संस्करण 2.8.6 है।<ref name="dlmalloc">{{cite web |last1=Lee |first1=Doug |title=A Memory Allocator |url=http://gee.cs.oswego.edu/dl/html/malloc.html |access-date=1 December 2019}} [http://gee.cs.oswego.edu/pub/misc/malloc.c HTTP for Source Code]</ref>
dlmalloc एक सीमा टैग आवंटक है। हीप मेमोरी पर मेमोरी को चंक्स के रूप में आवंटित किया जाता है, एक 8-बाइट [[डेटा संरचना]] संरेखण डेटा संरचना जिसमें एक हेडर और प्रयोग करने योग्य मेमोरी होती है। आवंटित मेमोरी में चंक के आकार और उपयोग के झंडे ([[डोप वेक्टर]] के समान) के लिए 8- या 16-बाइट ओवरहेड होता है। अनाबंटित चंक्स उपयोग करने योग्य स्थान क्षेत्र में अन्य फ्री चंक्स के लिए पॉइंटर्स को भी स्टोर करते हैं, जिससे 32-बिट सिस्टम पर न्यूनतम चंक आकार 16 बाइट्स और 64-बिट सिस्टम पर 24/32 (संरेखण पर निर्भर करता है) बाइट्स बनते हैं।<ref name="phrack-57-8" /><ref name="dlmalloc"/>{{rp|at=2.8.6, Minimum allocated size}}
 
असंबद्ध मेमोरी को समान आकार के [[बिन (कम्प्यूटेशनल ज्यामिति)]] में समूहीकृत किया जाता है, जिसे चंक्स की डबल-लिंक्ड सूची का उपयोग करके कार्यान्वित किया जाता है (चंक के अंदर असंबद्ध स्थान में संग्रहीत पॉइंटर्स के साथ)। डिब्बे आकार के अनुसार तीन वर्गों में क्रमबद्ध होते हैं:<ref name="phrack-57-8" /><ref name="dlmalloc"/>{{rp|at=Overlaid data structures}}
डीएलमॉलोक एक सीमा टैग आवंटक है। हीप पर स्मृति को "हिस्से" के रूप में आवंटित किया जाता है, एक 8-बाइट संरेखित [[डेटा संरचना]] जिसमें एक हेडर और प्रयोग करने योग्य स्मृति होती है। आवंटित स्मृति में हिस्से के आकार और उपयोग के झंडे ([[डोप वेक्टर|डोप सदिश]] के समान) के लिए 8- या 16-बाइट ओवरहेड होता है। अनाबंटित हिस्से उपयोग करने योग्य स्थान क्षेत्र में अन्य मुक्त हिस्से के लिए संकेत को भी संग्रह करते हैं, जिससे 32-बिट प्रणाली पर न्यूनतम हिस्सा आकार 16 बाइट्स और 64-बिट प्रणाली पर 24/32 (संरेखण पर निर्भर करता है) बाइट्स बनते हैं।<ref name="phrack-57-8" /><ref name="dlmalloc" />{{rp|at=: 2.8.6, न्यूनतम आवंटित आकार}}
* 256 बाइट्स (स्मॉलबिन अनुरोध) से नीचे के अनुरोधों के लिए, एक साधारण दो पावर बेस्ट फिट एलोकेटर का उपयोग किया जाता है। यदि उस बिन में कोई मुक्त ब्लॉक नहीं है, तो अगले उच्चतम बिन से एक ब्लॉक दो भागों में विभाजित हो जाता है।
 
* 256 बाइट्स या उससे ऊपर के अनुरोधों के लिए, लेकिन [[mmap]] थ्रेशोल्ड के नीचे, v2.8.0 के बाद से dlmalloc Trie#Bitwise try|in-place बिटवाइज़ ट्राई एल्गोरिथम (ट्रीबिन) का उपयोग करें। यदि अनुरोध को पूरा करने के लिए कोई खाली स्थान नहीं बचा है, तो dlmalloc ढेर के आकार को बढ़ाने की कोशिश करता है, सामान्यतः [[sbrk]] सिस्टम कॉल के माध्यम से। यह सुविधा ptmalloc (v2.7.x से) बनने के बाद पेश की गई थी, और इसके परिणामस्वरूप यह glibc का हिस्सा नहीं है, जो पुराने सबसे फिट आवंटक को विरासत में मिला है।
असंबद्ध स्मृति को समान आकार के [[बिन (कम्प्यूटेशनल ज्यामिति)|"डिब्बे"]] में समूहीकृत किया जाता है, जिसे हिस्से की दुगुनी-संबद्‌ध सूची का उपयोग करके कार्यान्वित किया जाता है (हिस्से के अंदर असंबद्ध स्थान में संग्रहीत संकेत के साथ)। डिब्बे आकार के अनुसार तीन वर्गों में क्रमबद्ध होते हैं:<ref name="phrack-57-8" /><ref name="dlmalloc" />{{rp|at=ओवरलेड डेटा संरचना}}
* एमएमएपी थ्रेसहोल्ड (लार्जबिन अनुरोध) से ऊपर के अनुरोधों के लिए, मेमोरी हमेशा एमएमएपी सिस्टम कॉल का उपयोग करके आवंटित की जाती है। सीमा सामान्यतः 256 केबी होती है।<ref name="glibc-env">{{cite web |url=https://www.gnu.org/software/libc/manual/html_node/Malloc-Tunable-Parameters.html |title=Malloc Tunable Parameters |publisher=[[GNU]] |access-date=2 May 2009 }}</ref> एमएमएपी विधि बड़े बफ़र्स के साथ उनकी समाप्ति के बाद अंत में एक छोटे से आवंटन को फंसाने की समस्या को टालती है, लेकिन हमेशा मेमोरी के एक पूरे पृष्ठ (कंप्यूटर मेमोरी) को आवंटित करती है, जो कई आर्किटेक्चर पर आकार में 4096 बाइट्स है।<ref>{{cite web |last=Sanderson |first=Bruce |url=http://support.microsoft.com/kb/555223 |title=RAM, Virtual Memory, Pagefile and all that stuff |publisher=Microsoft Help and Support |date=12 December 2004 }}</ref>
* 256 बाइट्स ("स्मॉलबिन" अनुरोध) से नीचे के अनुरोधों के लिए, एक साधारण दो शक्ति श्रेष्ठतम आसंजन संभाजक का उपयोग किया जाता है। यदि उस बिन में कोई मुक्त ब्लॉक नहीं है, तो अगले उच्चतम बिन से एक ब्लॉक दो भागों में विभाजित हो जाता है।
गेम डेवलपर एड्रियन स्टोन का तर्क है कि {{code|dlmalloc}}, एक सीमा-टैग आवंटक के रूप में, कंसोल सिस्टम के लिए अमित्र है जिसमें वर्चुअल मेमोरी है लेकिन [[मांग पेजिंग]] नहीं है। ऐसा इसलिए है क्योंकि इसके पूल-सिकुड़ते और बढ़ते कॉलबैक (सिसालोक/सिस्ट्रिम) का उपयोग वर्चुअल मेमोरी के अलग-अलग पेजों को आवंटित करने और कमिट करने के लिए नहीं किया जा सकता है। डिमांड पेजिंग के अभाव में विखंडन एक बड़ी चिंता बन जाता है।<ref>{{cite web |last1=Stone |first1=Adrian |title=The Hole That dlmalloc Can't Fill |url=http://gameangst.com/?p=496 |website=Game Angst |access-date=1 December 2019}}</ref>
* 256 बाइट्स या उससे ऊपर के अनुरोधों के लिए, लेकिन [[mmap]] देहली के नीचे, v2.8.0 के बाद से डीएलमॉलोक स्वस्था ने बिटवाइज़ ट्राई कलनविधीय ("ट्रीबिन") का उपयोग करता है। यदि अनुरोध को पूरा करने के लिए कोई खाली स्थान नहीं बचा है, तो सामान्यतः [[sbrk|brk]] प्रणाली कॉल के माध्यम से हीप के आकार को बढ़ाने का प्रयत्न करता है। यह सुविधा पीटीमॉलोक (v2.7.x से) बनने के बाद प्रस्तावित की गई थी, और इसके परिणामस्वरूप यह glibc का हिस्सा नहीं है, जो पुराने सबसे सर्वोत्तम योग्य आवंटक को विरासत में मिला है।
* एमएमएपी थ्रेसहोल्ड ("लार्जबिन" अनुरोध) से ऊपर के अनुरोधों के लिए, स्मृति हमेशा एमएमएपी प्रणाली कॉल का उपयोग करके आवंटित की जाती है। थ्रेसहोल्ड सामान्यतः 256 KB है।<ref name="glibc-env">{{cite web |url=https://www.gnu.org/software/libc/manual/html_node/Malloc-Tunable-Parameters.html |title=Malloc Tunable Parameters |publisher=[[GNU]] |access-date=2 May 2009 }}</ref> एमएमएपी प्रणाली बड़े बफ़र्स के साथ उनकी समाप्ति के बाद अंत में एक छोटे से आवंटन को फंसाने की समस्या को टालती है, लेकिन हमेशा स्मृति के एक पूरे पृष्ठ को आवंटित करती है, जो कई वास्तुकला पर आकार में 4096 बाइट्स है।<ref>{{cite web |last=Sanderson |first=Bruce |url=http://support.microsoft.com/kb/555223 |title=RAM, Virtual Memory, Pagefile and all that stuff |publisher=Microsoft Help and Support |date=12 December 2004 }}</ref>
खेल विकसक एड्रियन स्टोन का तर्क है कि{{code|dlmalloc}}, एक सीमा-टैग आवंटक के रूप में, कंसोल प्रणाली के लिए अमित्र है जिसमें आभासी स्मृति है लेकिन [[मांग पेजिंग|मांग पृष्ठन]] नहीं है। ऐसा इसलिए है क्योंकि इसके पूल-सिकुड़ते और बढ़ते कॉलबैक (सिसालोक/सिस्ट्रिम) का उपयोग आभासी स्मृति के अलग-अलग पृष्ठ को आवंटित करने और समर्पण करने के लिए नहीं किया जा सकता है। [[मांग पेजिंग|मांग पृष्ठन]] के अभाव में विखंडन एक बड़ी चिंता बन जाता है।<ref>{{cite web |last1=Stone |first1=Adrian |title=The Hole That dlmalloc Can't Fill |url=http://gameangst.com/?p=496 |website=Game Angst |access-date=1 December 2019}}</ref>
=== [[FreeBSD]]'s और [[NetBSD]]'s jemalloc ===
=== [[FreeBSD]]'s और [[NetBSD]]'s jemalloc ===
FreeBSD 7.0 और NetBSD 5.0 ​​के बाद से, पुराना <code>malloc</code> कार्यान्वयन ([[Poul-Henning Kamp]] द्वारा phkmalloc) को जेसन इवांस द्वारा लिखित [http://jemalloc.net/ jemalloc] द्वारा प्रतिस्थापित किया गया था। इसका मुख्य कारण मल्टीथ्रेडिंग के मामले में phkmalloc की मापनीयता की कमी थी। लॉक विवाद से बचने के लिए, जेमलोक प्रत्येक केंद्रीय प्रसंस्करण इकाई के लिए अलग-अलग एरेनास का उपयोग करता है। मल्टीथ्रेडिंग एप्लिकेशन में प्रति सेकंड आवंटन की संख्या को मापने वाले प्रयोगों से पता चला है कि यह इसे थ्रेड्स की संख्या के साथ रैखिक रूप से स्केल करता है, जबकि phkmalloc और dlmalloc दोनों के लिए प्रदर्शन थ्रेड्स की संख्या के व्युत्क्रमानुपाती था।<ref>{{cite web |url=http://people.freebsd.org/~jasone/jemalloc/bsdcan2006/jemalloc.pdf |title=A Scalable Concurrent malloc(3) Implementation for FreeBSD |first=Jason |last=Evans |date=16 April 2006 |access-date=18 March 2012 }}</ref>
FreeBSD 7.0 और NetBSD 5.0 ​​के बाद से, पुराने<code>malloc</code>कार्यान्वयन ([[Poul-Henning Kamp|पॉल-हेनिंग कैंप]] द्वारा phkmalloc) को जेसन इवांस द्वारा लिखित [http://jemalloc.net/ jemalloc] द्वारा प्रतिस्थापित किया गया था। इसका मुख्य कारण बहु सूत्रण के संबंध में phkmalloc की मापनीयता की कमी थी। लॉक विवाद से बचने के लिए, jemalloc प्रत्येक सीपीयू के लिए अलग "एरेनास" का उपयोग करता है। बहु सूत्रण अनुप्रयोग में प्रति सेकंड आवंटन की संख्या को मापने वाले प्रयोगों से पता चला है कि यह इसे थ्रेड्स की संख्या के साथ रैखिक रूप से पैमाना करते है, जबकि phkmalloc और डीएलमॉलोक दोनों के लिए प्रदर्शन थ्रेड्स की संख्या के व्युत्क्रमानुपाती थे।<ref>{{cite web |url=http://people.freebsd.org/~jasone/jemalloc/bsdcan2006/jemalloc.pdf |title=A Scalable Concurrent malloc(3) Implementation for FreeBSD |first=Jason |last=Evans |date=16 April 2006 |access-date=18 March 2012 }}</ref>
=== [[ओपनबीएसडी]] का मॉलोक ===
=== [[ओपनबीएसडी]] का मॉलोक ===
OpenBSD का कार्यान्वयन <code>malloc</code> समारोह एमएमएपी का उपयोग करता है। एक पृष्ठ से बड़े आकार के अनुरोधों के लिए, संपूर्ण आवंटन का उपयोग करके पुनर्प्राप्त किया जाता है <code>mmap</code>; द्वारा अनुरक्षित मेमोरी पूल से छोटे आकार निर्दिष्ट किए जाते हैं <code>malloc</code> कई बकेट पेजों के भीतर, साथ ही आवंटित भी <code>mmap</code>.<ref>{{cite web|url=http://bxr.su/OpenBSD/lib/libc/stdlib/malloc.c |title=libc/stdlib/malloc.c |website=BSD Cross Reference, OpenBSD src/lib/}}</ref>{{better source needed|date=November 2015}} एक कॉल पर <code>free</code>, मेमोरी को रिलीज़ किया जाता है और प्रोसेस [[पता स्थान]] का उपयोग करके अनमैप किया जाता है <code>munmap</code>. इस प्रणाली को ओपनबीएसडी के हिस्से के रूप में कार्यान्वित [[एड्रेस स्पेस लेआउट रैंडमाइजेशन]] और गैप पेज सुविधाओं का लाभ उठाकर सुरक्षा में सुधार करने के लिए डिज़ाइन किया गया है। <code>mmap</code> [[सिस्टम कॉल]], और उपयोग-बाद-मुक्त बग का पता लगाने के लिए- चूंकि एक बड़ी मेमोरी आवंटन मुक्त होने के बाद पूरी तरह से मैप नहीं किया गया है, आगे के उपयोग से विभाजन की गलती और प्रोग्राम की समाप्ति का कारण बनता है।
<code>malloc</code>फलन के ओपनबीएसडी का कार्यान्वयन एमएमएपी का उपयोग करता है। एक पृष्ठ से बड़े आकार के अनुरोधों के लिए, संपूर्ण आवंटन<code>mmap</code>का उपयोग करके पुनर्प्राप्त किया जाता है; कई "बाल्टी पृष्ठों" के भीतर, <code>malloc</code>द्वारा अनुरक्षित स्मृति पूल से छोटे आकार निर्दिष्ट किए जाते हैं, जिन्हें एमएमएपी के साथ भी आवंटित किया जाता है।<ref>{{cite web|url=http://bxr.su/OpenBSD/lib/libc/stdlib/malloc.c |title=libc/stdlib/malloc.c |website=BSD Cross Reference, OpenBSD src/lib/}}</ref>{{better source needed|date=November 2015}} मुक्त करने के लिए एक कॉल पर, स्मृति को जारी किया जाता है और <code>munmap</code>का उपयोग करके प्रक्रिया पता स्थान से किया जाता है। इस प्रणाली को ओपनबीएसडी के एमएमएपी प्रणाली कॉल के हिस्से के रूप में कार्यान्वित पता स्थान लेआउट यादृच्छिकीकरण और अंतराल पृष्ठ सुविधाओं का लाभ उठाकर सुरक्षा में सुधार करने के लिए रचना की गयी है, और उपयोग-बाद-मुक्त बग का पता लगाने के लिए - क्योंकि एक बड़ी स्मृति आवंटन मुक्त होने के बाद पूरी तरह से अप्रतिचित्रित है, आगे के उपयोग से विभाजन की दोष और क्रमादेश की समाप्ति होती है।
 
ग्राफीनोस परियोजना प्रारंभ में ओपनबीएसडी के स्मृति आवंटनकर्ता को एंड्रॉइड की बायोनिक सी लाइब्रेरी में पोर्ट करके प्रारंभ की गई थी।
=== होर्ड मॉलोक ===
=== होर्ड मॉलोक ===
{{main|Hoard memory allocator}}
{{main|होर्ड स्मृति आवंटनकर्ता}}
होर्ड एक एलोकेटर है जिसका लक्ष्य स्केलेबल मेमोरी आवंटन प्रदर्शन है। OpenBSD के संभाजक की तरह, होर्ड उपयोग करता है <code>mmap</code> विशेष रूप से, लेकिन सुपरब्लॉक कहे जाने वाले 64 किलोबाइट के टुकड़ों में मेमोरी का प्रबंधन करता है। होर्ड के हीप को तार्किक रूप से एक ग्लोबल हीप और कई प्रति-प्रोसेसर हीप में विभाजित किया गया है। इसके अलावा, एक थ्रेड-लोकल कैश है जो सीमित संख्या में सुपरब्लॉक रख सकता है। स्थानीय प्रति-थ्रेड या प्रति-प्रोसेसर हीप पर केवल सुपरब्लॉक से आवंटित करके, और ज्यादातर खाली सुपरब्लॉक को ग्लोबल हीप में ले जाकर अन्य प्रोसेसर द्वारा पुन: उपयोग किया जा सकता है, थ्रेड्स की संख्या के साथ रैखिक मापनीयता प्राप्त करते समय होर्ड विखंडन को कम रखता है .<ref>{{Cite conference | doi = 10.1145/378993.379232| title = Hoard: A Scalable Memory Allocator for Multithreaded Applications| work = Proceedings of the ninth international conference on Architectural support for programming languages and operating systems| conference = [[International Conference on Architectural Support for Programming Languages and Operating Systems|ASPLOS]]-IX| pages = 117–128| date=November 2000 | last1 = Berger | first1 = E. D. | last2 = McKinley | first2 = K. S. |author2-link = Kathryn S. McKinley| last3 = Blumofe | first3 = R. D. | last4 = Wilson | first4 = P. R. | isbn = 1-58113-317-0| url = http://www.cs.umass.edu/~emery/pubs/berger-asplos2000.pdf| citeseerx = 10.1.1.1.4174}}</ref>
 
होर्ड एक संभाजक है जिसका लक्ष्य मापनीय स्मृति आवंटन प्रदर्शन है। ओपनबीएसडी आवंटक की तरह, होर्ड विशेष रूप से<code>mmap</code>का उपयोग करता है, लेकिन 64 किलोबाइट के टुकड़ों में स्मृति का प्रबंधन करता है जिसे सुपरब्लॉक कहा जाता है। होर्ड के हीप को तार्किक रूप से एक वैश्विक हीप और कई प्रति-संसाधित्र हीप में विभाजित किया गया है। इसके अलावा, एक थ्रेड-स्थानीय कैश है जो सीमित संख्या में सुपरब्लॉक रख सकता है। स्थानीय प्रति-थ्रेड या प्रति-संसाधित्र हीप पर केवल सुपरब्लॉक से आवंटित करके, और ज्यादातर खाली सुपरब्लॉक को वैश्विक हीप में ले जाकर अन्य संसाधित्र द्वारा पुन: उपयोग किया जा सकता है, थ्रेड्स की संख्या के साथ रैखिक मापनीयता प्राप्त करते समय होर्ड विखंडन को कम रखता है।<ref>{{Cite conference | doi = 10.1145/378993.379232| title = Hoard: A Scalable Memory Allocator for Multithreaded Applications| work = Proceedings of the ninth international conference on Architectural support for programming languages and operating systems| conference = [[International Conference on Architectural Support for Programming Languages and Operating Systems|ASPLOS]]-IX| pages = 117–128| date=November 2000 | last1 = Berger | first1 = E. D. | last2 = McKinley | first2 = K. S. |author2-link = Kathryn S. McKinley| last3 = Blumofe | first3 = R. D. | last4 = Wilson | first4 = P. R. | isbn = 1-58113-317-0| url = http://www.cs.umass.edu/~emery/pubs/berger-asplos2000.pdf| citeseerx = 10.1.1.1.4174}}</ref>
=== मिमललोक ===
=== मिमललोक ===
{{main|mimalloc}}
{{main|मिमललोक}}
प्रदर्शन पर ध्यान देने के साथ [[माइक्रोसॉफ्ट रिसर्च]] से एक [[खुला स्त्रोत]] | ओपन-सोर्स कॉम्पैक्ट सामान्य-उद्देश्य [[मेमोरी एलोकेटर]]<ref>[https://slashdot.org/firehose.pl?op=view&id=110928452 Microsoft releases optimized malloc() as open source - Slashdot]</ref> पुस्तकालय कोड की लगभग 11,000 पंक्तियाँ हैं।
प्रदर्शन पर ध्यान देने के साथ [[माइक्रोसॉफ्ट रिसर्च|माइक्रोसॉफ्ट अनुसंधान]] से एक [[खुला स्त्रोत]] संहत सामान्य-उद्देश्य [[मेमोरी एलोकेटर|स्मृति संभाजक]] हैं।<ref>[https://slashdot.org/firehose.pl?op=view&id=110928452 Microsoft releases optimized malloc() as open source - Slashdot]</ref> लाइब्रेरी कूट की लगभग 11,000 पंक्तियाँ हैं।
=== थ्रेड-कैशिंग मॉलोक (tcmalloc) ===
=== थ्रेड-कैशिंग मॉलोक (टीसीमॉलोक) ===
छोटे आवंटन के लिए प्रत्येक थ्रेड में [[थ्रेड-लोकल स्टोरेज]] होता है। बड़े आवंटन के लिए mmap या sbrk का उपयोग किया जा सकता है। [https://code.google.com/p/gperftools/ TCMalloc], Google द्वारा विकसित एक malloc,<ref>[//code.google.com/p/gperftools/ TCMalloc homepage]</ref> मृत धागे के स्थानीय भंडारण के लिए कचरा संग्रह है। TCMalloc को बहुप्रचारित प्रोग्रामों के लिए glibc के ptmalloc से दुगने से भी अधिक तेज़ माना जाता है।<ref>Ghemawat, Sanjay; Menage, Paul; [http://goog-perftools.sourceforge.net/doc/tcmalloc.html ''TCMalloc : Thread-Caching Malloc'']</ref><ref>{{cite web |first=Mark |last=Callaghan |url=http://mysqlha.blogspot.com/2009/01/double-sysbench-throughput-with_18.html |title=High Availability MySQL: Double sysbench throughput with TCMalloc |work=Mysqlha.blogspot.com |date=18 January 2009 |access-date=18 September 2011 }}</ref>
छोटे आवंटन के लिए प्रत्येक थ्रेड में [[थ्रेड-लोकल स्टोरेज|थ्रेड-स्थानीय भंडारण]] होता है। बड़े आवंटन के लिए mmap या sbrk का उपयोग किया जा सकता है। [https://code.google.com/p/gperftools/ TCMalloc], Google द्वारा विकसित एक malloc,<ref>[//code.google.com/p/gperftools/ TCMalloc homepage]</ref> मृत थ्रेड के स्थानीय भंडारण के लिए कचरा संग्रह है। टीसीएमलोक को बहुप्रचारित क्रमादेशों के लिए glibc के पीटीमॉलोक से दुगने से भी अधिक तेज़ माना जाता है।<ref>Ghemawat, Sanjay; Menage, Paul; [http://goog-perftools.sourceforge.net/doc/tcmalloc.html ''TCMalloc : Thread-Caching Malloc'']</ref><ref>{{cite web |first=Mark |last=Callaghan |url=http://mysqlha.blogspot.com/2009/01/double-sysbench-throughput-with_18.html |title=High Availability MySQL: Double sysbench throughput with TCMalloc |work=Mysqlha.blogspot.com |date=18 January 2009 |access-date=18 September 2011 }}</ref>
=== इन-कर्नेल ===
=== कर्नेल में ===
ऑपरेटिंग सिस्टम कर्नेल (कंप्यूटर साइंस) को एप्लिकेशन प्रोग्राम की तरह ही मेमोरी आवंटित करने की आवश्यकता होती है। का कार्यान्वयन <code>malloc</code> तथापि, कर्नेल के भीतर अक्सर सी पुस्तकालयों द्वारा उपयोग किए जाने वाले कार्यान्वयन से काफी भिन्न होता है। उदाहरण के लिए, मेमोरी बफ़र्स को [[प्रत्यक्ष मेमोरी एक्सेस]] द्वारा लगाए गए विशेष प्रतिबंधों के अनुरूप होने की आवश्यकता हो सकती है, या मेमोरी आवंटन फ़ंक्शन को इंटरप्ट संदर्भ से कॉल किया जा सकता है।<ref>{{cite web |url=http://people.netfilter.org/rusty/unreliable-guides/kernel-hacking/routines-kmalloc.html |title=kmalloc()/kfree() include/linux/slab.h |work=People.netfilter.org |access-date=18 September 2011 }}</ref> यह एक की आवश्यकता है <code>malloc</code> कार्यान्वयन ऑपरेटिंग सिस्टम कर्नेल के [[आभासी मेमोरी]] सबसिस्टम के साथ कसकर एकीकृत है।
संचालन प्रणाली कर्नेल को अनुप्रयोग क्रमादेश की तरह ही स्मृति आवंटित करने की आवश्यकता होती है। तथापि, कर्नेल के भीतर<code>malloc</code>का कार्यान्वयन प्रायः सी लाइब्रेरी द्वारा उपयोग किए जाने वाले कार्यान्वयन से काफी भिन्न होता है। उदाहरण के लिए, स्मृति बफ़र्स को डीएमए द्वारा लगाए गए विशेष प्रतिबंधों के अनुरूप होने की आवश्यकता हो सकती है, या स्मृति आवंटन फलन को बाधित संदर्भ से बुलाया जा सकता है।<ref>{{cite web |url=http://people.netfilter.org/rusty/unreliable-guides/kernel-hacking/routines-kmalloc.html |title=kmalloc()/kfree() include/linux/slab.h |work=People.netfilter.org |access-date=18 September 2011 }}</ref> यह संचालन प्रणाली कर्नेल के [[आभासी मेमोरी|आभासी स्मृति]] उपप्रणाली के साथ मज़बूती से एकीकृत<code>malloc</code>कार्यान्वयन की आवश्यकता है।


== मॉलोक ओवरराइडिंग ==
== अधिभावी मॉलोक ==
क्योंकि <code>malloc</code> और उसके रिश्तेदार किसी प्रोग्राम के प्रदर्शन पर गहरा प्रभाव डाल सकते हैं,<!--TODO: cite Bentley's Programming Pearls--> एप्लिकेशन के आवंटन पैटर्न के लिए अनुकूलित किए गए कस्टम कार्यान्वयन द्वारा किसी विशिष्ट एप्लिकेशन के कार्यों को ओवरराइड करना असामान्य नहीं है। सी मानक ऐसा करने का कोई तरीका प्रदान नहीं करता है, लेकिन ऑपरेटिंग सिस्टम ने डायनेमिक लिंकिंग का फायदा उठाकर ऐसा करने के कई तरीके खोजे हैं। प्रतीकों को ओवरराइड करने के लिए एक तरीका केवल एक अलग पुस्तकालय में लिंक करना है। एक अन्य, UNIX System V#SVR3|Unix System V.3 द्वारा नियोजित, बनाना है <code>malloc</code> और <code>free</code> फ़ंक्शन पॉइंटर्स जो एक एप्लिकेशन कस्टम प्रकार्य पर रीसेट कर सकता है।<ref name="Levine_1999_CH9"/>
क्योंकि<code>malloc</code>और उसके परिजन किसी क्रमादेश के प्रदर्शन पर एक मजबूत प्रभाव डाल सकते हैं, यह सीमा कार्यान्वयन द्वारा किसी विशिष्ट अनुप्रयोग के कार्यों को अध्यारोहण करने के लिए असामान्य नहीं है जो कि अनुप्रयोग के आवंटन प्रतिरूप के लिए अनुकूलित हैं। सी मानक ऐसा करने का कोई प्रकार प्रदान नहीं करता है, लेकिन संचालन प्रणाली ने गतिशील संयोजन का समुपयोजन कर ऐसा करने के कई प्रकार स्थापित हैं। प्रतीकों को अध्यारोहण करने के लिए एक प्रकार केवल एक अलग लाइब्रेरी में संयोजक करना है। एक अन्य, यूनिक्स प्रणाली V.3 द्वारा नियोजित,<code>malloc</code>और<code>free</code>फलन संकेत जो एक अनुप्रयोग सीमा प्रकार्य पर पुनर्नियोजन कर सकता है।<ref name="Levine_1999_CH9"/>


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


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


सैद्धांतिक रूप से, सबसे बड़ी संख्या वह अधिकतम मान होना चाहिए जिसे a में रखा जा सकता है <code>[[size_t]]</code> प्रकार, जो एक कार्यान्वयन-निर्भर अहस्ताक्षरित पूर्णांक है जो स्मृति के क्षेत्र के आकार का प्रतिनिधित्व करता है। [[C99]] मानक में और बाद में, यह के रूप में उपलब्ध है <code>SIZE_MAX</code> से लगातार <code>&lt;[[stdint.h]]&gt;</code>. तथापि इसकी गारंटी नहीं है {{nowrap|ISO C}}, यह सामान्यतः है <code>2^(CHAR_BIT * [[sizeof]](size_t)) - 1</code>.
सैद्धांतिक रूप से, सबसे बड़ी संख्या वह अधिकतम मान होनी चाहिए जिसे<code>[[size_t]]</code>प्रकार में रखा जा सकता है, जो एक कार्यान्वयन-निर्भर अहस्ताक्षरित पूर्णांक है जो स्मृति के क्षेत्र के आकार का प्रतिनिधित्व करते है। [[C99]] मानक में और बाद में, यह<code>&lt;[[stdint.h]]&gt;</code>से<code>SIZE_MAX</code>स्थिरांक के रूप में उपलब्ध है। यद्यपि {{nowrap|ISO C}} द्वारा गारंटितकृत नहीं है, यह सामान्यतः <code>2^(CHAR_BIT * [[sizeof]](size_t)) - 1</code>होता है।


ग्लिबैक सिस्टम पर, सबसे बड़ा संभावित मेमोरी ब्लॉक <code>malloc</code> आवंटित कर सकते हैं केवल इस आकार का आधा है, अर्थात् <code>2^(CHAR_BIT * [[sizeof]](ptrdiff_t) - 1) - 1</code>.<ref>{{cite web |url=https://sourceware.org/bugzilla/show_bug.cgi?id=23741#c2 |title=malloc: make malloc fail with requests larger than PTRDIFF_MAX |date=18 April 2019 |website=Sourceware Bugzilla |access-date=30 July 2020}}</ref>
ग्लिबैक प्रणाली पर, सबसे बड़ा संभावित स्मृति ब्लॉक<code>malloc</code>आवंटित कर सकता हैं जो इस आकार का केवल आधा है, अर्थात् <code>2^(CHAR_BIT * [[sizeof]](ptrdiff_t) - 1) - 1</code>.<ref>{{cite web |url=https://sourceware.org/bugzilla/show_bug.cgi?id=23741#c2 |title=malloc: make malloc fail with requests larger than PTRDIFF_MAX |date=18 April 2019 |website=Sourceware Bugzilla |access-date=30 July 2020}}</ref>
== एक्सटेंशन और विकल्प ==
== विस्तार और विकल्प ==
सी लाइब्रेरी कार्यान्वयन विभिन्न ऑपरेटिंग सिस्टम और कंपाइलर्स के साथ मानक के विकल्प और एक्सटेंशन के साथ आ सकता है <code>malloc</code> इंटरफेस। इनमें से उल्लेखनीय है:
विभिन्न संचालन प्रणाली और अनुभाषक के साथ सी लाइब्रेरी कार्यान्वयन शिपिंग मानक<code>malloc</code>अंतरापृष्ठ के विकल्प और विस्तार के साथ आ सकता है। इनमें से उल्लेखनीय है:


* <code>[[alloca]]</code>, जो कॉल स्टैक पर बाइट्स की अनुरोधित संख्या आवंटित करता है। कोई संबंधित डीलोकेशन फ़ंक्शन मौजूद नहीं है, क्योंकि सामान्यतः कॉलिंग फ़ंक्शन के वापस आते ही मेमोरी को हटा दिया जाता है। <code>alloca</code> UNIX/32V|32/V (1978) से ही यूनिक्स सिस्टम पर मौजूद था, लेकिन इसका उपयोग कुछ (जैसे, एम्बेडेड) संदर्भों में समस्याग्रस्त हो सकता है।<ref>{{Cite web|title = Why is the use of alloca() not considered good practice?|url = https://stackoverflow.com/questions/1018853/why-is-the-use-of-alloca-not-considered-good-practice|website = stackoverflow.com|access-date = 2016-01-05}}</ref> जबकि कई कंपाइलरों द्वारा समर्थित है, यह एएनएसआई सी | एएनएसआई-सी मानक का हिस्सा नहीं है और इसलिए हमेशा पोर्टेबल नहीं हो सकता है। इससे मामूली प्रदर्शन समस्याएं भी हो सकती हैं: यह चर-आकार के स्टैक फ़्रेमों की ओर ले जाती है, ताकि दोनों कॉल स्टैक#STACK-POINTER को प्रबंधित करने की आवश्यकता हो (निश्चित आकार के स्टैक फ़्रेमों के साथ, इनमें से एक बेमानी है)।<ref>{{cite web |first1=Saman |last1=Amarasinghe |first2=Charles |last2=Leiserson |title=6.172 Performance Engineering of Software Systems, Lecture 10 |year=2010 |publisher=Massachusetts Institute of Technology |website=MIT OpenCourseWare |url=http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-172-performance-engineering-of-software-systems-fall-2010/video-lectures/lecture-8-cache-efficient-algorithms/ |access-date=27 January 2015 |archive-url=https://web.archive.org/web/20150622092347/http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-172-performance-engineering-of-software-systems-fall-2010/video-lectures/lecture-8-cache-efficient-algorithms/ |archive-date=22 June 2015 }}</ref> बड़े आवंटन से [[स्टैक ओवरफ़्लो]] के कारण अपरिभाषित व्यवहार का जोखिम भी बढ़ सकता है।<ref>{{Cite web|title = alloca(3) - Linux manual page|url = http://man7.org/linux/man-pages/man3/alloca.3.html|website = man7.org|access-date = 2016-01-05}}</ref> C99 ने वैकल्पिक ढेर आवंटन तंत्र के रूप में चर-लंबाई सरणियों की पेशकश की{{snd}} हालाँकि, इस सुविधा को बाद के C11 (C मानक संशोधन) मानक में वैकल्पिक कर दिया गया था।
* <code>[[alloca]]</code>, जो कॉल स्टैक पर बाइट्स की अनुरोधित संख्या आवंटित करता है। कोई संबंधित पुनःआवंटन फलन उपस्थित नहीं है, क्योंकि सामान्यतः कॉलिंग फलन के वापस आते ही स्मृति को हटा दिया जाता है। <code>alloca</code> UNIX/32V|32/V (1978) से ही यूनिक्स प्रणाली पर उपस्थित था, लेकिन इसका उपयोग कुछ (जैसे, अंत:स्थापित) संदर्भों में समस्याग्रस्त हो सकता है।<ref>{{Cite web|title = Why is the use of alloca() not considered good practice?|url = https://stackoverflow.com/questions/1018853/why-is-the-use-of-alloca-not-considered-good-practice|website = stackoverflow.com|access-date = 2016-01-05}}</ref> जबकि कई अनुभाषक द्वारा समर्थित है, यह एएनएसआई-सी मानक का भाग नहीं है और इसलिए हमेशा सुवाह्‍य नहीं हो सकता है। यह मामूली प्रदर्शन समस्याओं का कारण भी हो सकता है: यह चर-आकार के स्टैक फ़्रेमों की ओर ले जाता है, ताकि स्टैक और फ़्रेम संकेत दोनों को प्रबंधित करने की आवश्यकता हो (निश्चित आकार के स्टैक फ़्रेमों के साथ, इनमें से एक अनावश्यक है)।<ref>{{cite web |first1=Saman |last1=Amarasinghe |first2=Charles |last2=Leiserson |title=6.172 Performance Engineering of Software Systems, Lecture 10 |year=2010 |publisher=Massachusetts Institute of Technology |website=MIT OpenCourseWare |url=http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-172-performance-engineering-of-software-systems-fall-2010/video-lectures/lecture-8-cache-efficient-algorithms/ |access-date=27 January 2015 |archive-url=https://web.archive.org/web/20150622092347/http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-172-performance-engineering-of-software-systems-fall-2010/video-lectures/lecture-8-cache-efficient-algorithms/ |archive-date=22 June 2015 }}</ref> बड़े आवंटन से [[स्टैक ओवरफ़्लो|स्टैक अतिप्रवाह]] के कारण अपरिभाषित व्यवहार का जोखिम भी बढ़ सकता है।<ref>{{Cite web|title = alloca(3) - Linux manual page|url = http://man7.org/linux/man-pages/man3/alloca.3.html|website = man7.org|access-date = 2016-01-05}}</ref> C99 ने वैकल्पिक स्टैक आवंटन तंत्र के रूप में चर-लंबाई सरणियों की प्रस्तुति की{{snd}} हालाँकि, इस सुविधा को बाद के C11 मानक में वैकल्पिक रूप से हटा दिया गया था।
* POSIX एक फ़ंक्शन को परिभाषित करता है <code>posix_memalign</code> जो कॉलर-निर्दिष्ट संरेखण के साथ मेमोरी आवंटित करता है। इसका आवंटन विलोपित किया गया है <code>free</code>,<ref>{{man|sh|posix_memalign}}</ref> इसलिए कार्यान्वयन को सामान्यतः मॉलोक लाइब्रेरी का हिस्सा होना चाहिए।
* POSIX एक फलन को परिभाषित करता है<code>posix_memalign</code>को परिभाषित करता है जो दर्शनाथी-निर्दिष्ट संरेखण के साथ स्मृति आवंटित करता है। इसके आबंटनों को नि: शुल्क में आवंटित किया जाता है,<ref>{{man|sh|posix_memalign}}</ref> इसलिए कार्यान्वयन को सामान्यतः मॉलोक लाइब्रेरी का भाग होना चाहिए।


== यह भी देखें ==
== यह भी देखें ==
* [[बफ़र अधिकता]]
* [[बफ़र अधिकता|बफर अतिप्रवाह]]
* [[मेमोरी डीबगर]]
* [[मेमोरी डीबगर|स्मृति दोषमार्जक]]  
* [[स्मृति सुरक्षा]]
* [[स्मृति सुरक्षा]]
* पेज (कंप्यूटर मेमोरी)
* [[पृष्ठ आकार]]
* [[चर-लंबाई सरणी]]
* [[चर-लंबाई सरणी]]


Line 175: Line 176:


==बाहरी संबंध==
==बाहरी संबंध==
{{wikibooks|C Programming|C dynamic memory management|C Programming/C Reference}}
{{Wikiversity|C/Memory_Management}}
* [http://www.opengroup.org/onlinepubs/9699919799/functions/malloc.html Definition of malloc in IEEE Std 1003.1 standard]
* [http://www.opengroup.org/onlinepubs/9699919799/functions/malloc.html Definition of malloc in IEEE Std 1003.1 standard]
* [[Doug Lea|Lea, Doug]]; [http://gee.cs.oswego.edu/dl/html/malloc.html ''The design of the basis of the glibc allocator'']
* [[Doug Lea|Lea, Doug]]; [http://gee.cs.oswego.edu/dl/html/malloc.html ''The design of the basis of the glibc allocator'']
* Gloger, Wolfram; [http://www.malloc.de/en/ ''The ptmalloc homepage'']
* Gloger, Wolfram; [http://www.malloc.de/en/ ''The पीटीमॉलोक homepage'']
* Berger, Emery; [http://www.hoard.org/ ''The Hoard homepage'']
* Berger, Emery; [http://www.hoard.org/ ''The Hoard homepage'']
* Douglas, Niall; [http://www.nedprod.com/programs/portable/nedmalloc/ ''The nedmalloc homepage'']
* Douglas, Niall; [http://www.nedprod.com/programs/portable/nedmalloc/ ''The nedmalloc homepage'']
Line 193: Line 192:
* [https://sploitfun.wordpress.com/2015/02/10/understanding-glibc-malloc/ ''Understanding glibc malloc'']
* [https://sploitfun.wordpress.com/2015/02/10/understanding-glibc-malloc/ ''Understanding glibc malloc'']


{{Memory management navbox|state=expanded}}
[[Category:All articles lacking reliable references]]
{{CProLang|state=expanded}}
[[Category:All articles with unsourced statements]]
[[Category: स्मृति प्रबंधन]] [[Category: मेमोरी प्रबंधन सॉफ्टवेयर]] [[Category: सी मानक पुस्तकालय]] [[Category: उदाहरण सी कोड वाले लेख]] [[Category: सी ++]]  
[[Category:Articles lacking reliable references from November 2015]]
 
[[Category:Articles with hatnote templates targeting a nonexistent page]]
 
[[Category:Articles with invalid date parameter in template]]
 
[[Category:Articles with unsourced statements from July 2022]]
[[Category: Machine Translated Page]]
[[Category:CS1 English-language sources (en)]]
[[Category:Created On 17/02/2023]]
[[Category:Created On 17/02/2023]]
[[Category:Machine Translated Page]]
[[Category:Pages with script errors]]
[[Category:Templates Vigyan Ready]]
[[Category:Use dmy dates from May 2021]]
[[Category:उदाहरण सी कोड वाले लेख]]
[[Category:मेमोरी प्रबंधन सॉफ्टवेयर]]
[[Category:सी ++]]
[[Category:सी मानक पुस्तकालय]]
[[Category:स्मृति प्रबंधन]]

Latest revision as of 11:36, 10 March 2023

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

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

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

तर्क

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

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

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

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

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

कार्यों का अवलोकन

सी गतिशील स्मृति आवंटन कार्यों को stdlib.h हेडर (cstdlib सी ++ में हेडर) में परिभाषित किया गया है।[1]

कार्य विवरण
malloc बाइट्स की निर्दिष्ट संख्या आवंटित करता है
aligned_alloc निर्दिष्ट संरेखण पर बाइट्स की निर्दिष्ट संख्या आवंटित करता है
realloc स्मृति के निर्दिष्ट ब्लॉक के आकार को बढ़ाता या घटाता है, यदि आवश्यक हो तो इसे स्थानांतरित करता है
calloc बाइट्स की निर्दिष्ट संख्या आवंटित करता है और उन्हें शून्य से प्रारंभ करता है
free स्मृति के निर्दिष्ट ब्लॉक को प्रणाली में वापस मुक्त करता है

malloc() और calloc() के मध्य अंतर

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

उपयोग उदाहरण

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

int array[10];

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

int *array = malloc(10 * sizeof(int));

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

क्योंकिmallocअनुरोध को पूरा करने में सक्षम नहीं हो सकते है, यह एक शून्य सूचक लौटा सकते है और यह जांचने के लिए अच्छा क्रमादेशन अभ्यास है:

int *array = malloc(10 * sizeof(int));
if (array == NULL) {
 fprintf(stderr, "malloc failed\n");
 return -1;
}

जब क्रमादेश को गतिशील सरणी की आवश्यकता नहीं होती है, तो उसे मुक्त संग्रह ग्रहण करने वाली स्मृति को वापस करने के लिए कॉल मुक्त करना होगा:

free(array);

mallocद्वारा अलग की गई स्मृति को प्रारंभ नहीं किया गया है और इसमें क्रॉफ्ट हो सकता है: पहले प्रयोग किए गए और छोड़े गए डेटा के अवशेष। mallocके साथ आवंटन के बाद, सरणी के तत्व अप्रारंभीकृत चर हैं। आदेशcallocएक आवंटन लौटाएगा जो पहले ही साफ हो चुका है:

int *array = calloc(10, sizeof(int));

रीयलोक के साथ हम एक सूचक बिंदु की स्मृति की मात्रा का आकार बदल सकते हैं। उदाहरण के लिए, यदि हमारे पास आकार की सरणी के रूप में कार्य करने वाला सूचक है और हम इसे आकार की एक सरणी में बदलना चाहते हैं, तो हम रीयलोक का उपयोग कर सकते हैं।

int *arr = malloc(2 * sizeof(int));
arr[0] = 1;
arr[1] = 2;
arr = realloc(arr, 3 * sizeof(int));
arr[2] = 3;

ध्यान दें कि रीयलोक को ब्लॉक का आधार पता बदलना चाहिए (यानी यदि यह मूल ब्लॉक के आकार को बढ़ाने में विफल रहा है, और इसलिए कहीं और एक नया बड़ा ब्लॉक आवंटित किया है और इसमें पुराने विषय की प्रतिलिपि बनाई है)। इसलिए, मूल ब्लॉक के भीतर पतों के लिए कोई संकेतक भी अब मान्य नहीं हैं।

सुरक्षा प्रकार

mallocएक शून्य सूचक (शून्य*) देता है, जो इंगित करता है कि यह अज्ञात डेटा प्रकार के क्षेत्र के लिए सूचक है। मजबूत प्रकार की प्रणाली के कारण C++ में संचक का उपयोग आवश्यक है, जबकि सी में ऐसा नहीं है। कोई "संचक" कर सकता है (प्रकार रूपांतरण देखें) यह सूचक एक विशिष्ट प्रकार के लिए:

int *ptr, *ptr2;
ptr = malloc(10 * sizeof(*ptr)); /* without a cast */
ptr2 = (int *)malloc(10 * sizeof(*ptr)); /* with a cast */

ऐसी संचक करने के लाभ और नुकसान हैं।

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

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

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

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

सामान्य त्रुटियाँ

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

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

आवंटन विफलताओं की जांच नहीं करना:

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

स्मृति रिसाव:

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

तार्किक त्रुटियां:

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

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

कार्यान्वयन

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

हीप-आधारित

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

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

डीएलमॉलोक और पीटीमॉलोक

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

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

असंबद्ध स्मृति को समान आकार के "डिब्बे" में समूहीकृत किया जाता है, जिसे हिस्से की दुगुनी-संबद्‌ध सूची का उपयोग करके कार्यान्वित किया जाता है (हिस्से के अंदर असंबद्ध स्थान में संग्रहीत संकेत के साथ)। डिब्बे आकार के अनुसार तीन वर्गों में क्रमबद्ध होते हैं:[21][23]: ओवरलेड डेटा संरचना 

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

खेल विकसक एड्रियन स्टोन का तर्क है किdlmalloc, एक सीमा-टैग आवंटक के रूप में, कंसोल प्रणाली के लिए अमित्र है जिसमें आभासी स्मृति है लेकिन मांग पृष्ठन नहीं है। ऐसा इसलिए है क्योंकि इसके पूल-सिकुड़ते और बढ़ते कॉलबैक (सिसालोक/सिस्ट्रिम) का उपयोग आभासी स्मृति के अलग-अलग पृष्ठ को आवंटित करने और समर्पण करने के लिए नहीं किया जा सकता है। मांग पृष्ठन के अभाव में विखंडन एक बड़ी चिंता बन जाता है।[26]

FreeBSD's और NetBSD's jemalloc

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

ओपनबीएसडी का मॉलोक

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

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

होर्ड मॉलोक

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

मिमललोक

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

थ्रेड-कैशिंग मॉलोक (टीसीमॉलोक)

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

कर्नेल में

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

अधिभावी मॉलोक

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

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

आवंटन आकार की सीमा

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

सैद्धांतिक रूप से, सबसे बड़ी संख्या वह अधिकतम मान होनी चाहिए जिसेsize_tप्रकार में रखा जा सकता है, जो एक कार्यान्वयन-निर्भर अहस्ताक्षरित पूर्णांक है जो स्मृति के क्षेत्र के आकार का प्रतिनिधित्व करते है। C99 मानक में और बाद में, यह<stdint.h>सेSIZE_MAXस्थिरांक के रूप में उपलब्ध है। यद्यपि ISO C द्वारा गारंटितकृत नहीं है, यह सामान्यतः 2^(CHAR_BIT * sizeof(size_t)) - 1होता है।

ग्लिबैक प्रणाली पर, सबसे बड़ा संभावित स्मृति ब्लॉकmallocआवंटित कर सकता हैं जो इस आकार का केवल आधा है, अर्थात् 2^(CHAR_BIT * sizeof(ptrdiff_t) - 1) - 1.[36]

विस्तार और विकल्प

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

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

यह भी देखें

संदर्भ

  1. 1.0 1.1 7.20.3 Memory management functions (PDF). p. 313. {{cite book}}: |work= ignored (help)
  2. Summit, Steve. "Chapter 11: Memory Allocation". C Programming Notes. Retrieved 2020-07-11.
  3. "aligned_alloc(3) - Linux man page".
  4. Stroustrup, Bjarne (2008). Programming: Principles and Practice Using C++. Addison Wesley. p. 1009. ISBN 978-0-321-54372-1.
  5. "gcc manual". gnu.org. Retrieved 2008-12-14.
  6. Brian W. Kernighan, Dennis M. Ritchie, The C Programming Language, Prentice-Hall, 1978; Section 7.9 (page 156) describes calloc and cfree, and Section 8.7 (page 173) describes an implementation for alloc and free.
  7. alloc(3) – Version 6 Unix Programmer's Manual
  8. malloc(3) – Version 7 Unix Programmer's Manual
  9. Anonymous, Unix Programmer's Manual, Vol. 1, Holt Rinehart and Winston, 1983 (copyright held by Bell Telephone Laboratories, 1983, 1979); The man page for malloc etc. is given on page 275.
  10. alloca(3) – FreeBSD Library Functions Manual
  11. calloc(3) – Linux Programmer's Manual – Library Functions
  12. 12.0 12.1 "कास्टिंग मॉलोक". Cprogramming.com. Retrieved 2007-03-09.</रेफरी>
    • कास्टिंग से डेवलपर को प्रकार के आकार में विसंगतियों की पहचान करने में मदद मिल सकती है, यदि गंतव्य सूचक प्रकार में परिवर्तन होता है, खासकर यदि सूचक को दूर घोषित किया गया हो malloc() कॉल (हालांकि आधुनिक संकलक और स्थिर विश्लेषक कलाकारों की आवश्यकता के बिना इस तरह के व्यवहार पर चेतावनी दे सकते हैं<ref>"clang: lib/StaticAnalyzer/Checkers/MallocSizeofChecker.cpp Source File". clang.llvm.org. Retrieved 2018-04-01.
  13. "comp.lang.c FAQ list · Question 7.7b". C-FAQ. Retrieved 2007-03-09.
  14. Reek, Kenneth (1997-08-04). Pointers on C (in English) (1 ed.). Pearson. ISBN 9780673999863.
  15. "MEM04-C. Beware of zero-length allocations - SEI CERT C Coding Standard - Confluence". wiki.sei.cmu.edu.
  16. "POSIX.1-2017: malloc". pubs.opengroup.org. Retrieved 2019-11-29.
  17. Awakened (2019-10-02). "How a double-free bug in WhatsApp turns to RCE". Retrieved 2019-11-29.
  18. Felker, Rich [@RichFelker] (2019-10-03). "Wow. The WhatsApp RCE was the wrong behavior for realloc(p,0) so many implementations insist on" (Tweet). Retrieved 2022-08-06 – via Twitter.
  19. Alexandrescu, Andrei (2001). Modern C++ Design: Generic Programming and Design Patterns Applied. Addison-Wesley. p. 78.
  20. "Wolfram Gloger's malloc homepage". malloc.de. Retrieved 2018-04-01.
  21. 21.0 21.1 21.2 Kaempf, Michel (2001). "Vudo malloc tricks". Phrack (57): 8. Archived from the original on 2009-01-22. Retrieved 2009-04-29.
  22. "Glibc: Malloc Internals". sourceware.org Trac. Retrieved 2019-12-01.
  23. 23.0 23.1 23.2 Lee, Doug. "A Memory Allocator". Retrieved 2019-12-01. HTTP for Source Code
  24. "Malloc Tunable Parameters". GNU. Retrieved 2009-05-02.
  25. Sanderson, Bruce (2004-12-12). "RAM, Virtual Memory, Pagefile and all that stuff". Microsoft Help and Support.
  26. Stone, Adrian. "The Hole That dlmalloc Can't Fill". Game Angst. Retrieved 2019-12-01.
  27. Evans, Jason (2006-04-16). "A Scalable Concurrent malloc(3) Implementation for FreeBSD" (PDF). Retrieved 2012-03-18.
  28. "libc/stdlib/malloc.c". BSD Cross Reference, OpenBSD src/lib/.
  29. Berger, E. D.; McKinley, K. S.; Blumofe, R. D.; Wilson, P. R. (November 2000). Hoard: A Scalable Memory Allocator for Multithreaded Applications (PDF). ASPLOS-IX. Proceedings of the ninth international conference on Architectural support for programming languages and operating systems. pp. 117–128. CiteSeerX 10.1.1.1.4174. doi:10.1145/378993.379232. ISBN 1-58113-317-0.
  30. Microsoft releases optimized malloc() as open source - Slashdot
  31. TCMalloc homepage
  32. Ghemawat, Sanjay; Menage, Paul; TCMalloc : Thread-Caching Malloc
  33. Callaghan, Mark (2009-01-18). "High Availability MySQL: Double sysbench throughput with TCMalloc". Mysqlha.blogspot.com. Retrieved 2011-09-18.
  34. "kmalloc()/kfree() include/linux/slab.h". People.netfilter.org. Retrieved 2011-09-18.
  35. Levine, John R. (2000) [October 1999]. "Chapter 9: Shared libraries". Linkers and Loaders. The Morgan Kaufmann Series in Software Engineering and Programming (1 ed.). San Francisco, USA: Morgan Kaufmann. ISBN 1-55860-496-0. OCLC 42413382. Archived from the original on 2012-12-05. Retrieved 2020-01-12. Code: [1][2] Errata: [3]
  36. "malloc: make malloc fail with requests larger than PTRDIFF_MAX". Sourceware Bugzilla. 2019-04-18. Retrieved 2020-07-30.
  37. "Why is the use of alloca() not considered good practice?". stackoverflow.com. Retrieved 2016-01-05.
  38. Amarasinghe, Saman; Leiserson, Charles (2010). "6.172 Performance Engineering of Software Systems, Lecture 10". MIT OpenCourseWare. Massachusetts Institute of Technology. Archived from the original on 2015-06-22. Retrieved 2015-01-27.
  39. "alloca(3) - Linux manual page". man7.org. Retrieved 2016-01-05.
  40. posix_memalign – System Interfaces Reference, The Single UNIX Specification, Version 4 from The Open Group


बाहरी संबंध