यदि आपको स्मृति का सही आकार नहीं पता है जिसका आपको उपयोग करने की आवश्यकता है, तो आपको गतिशील आवंटन ( malloc
) की आवश्यकता है। एक उदाहरण तब हो सकता है जब कोई उपयोगकर्ता आपके एप्लिकेशन में कोई फ़ाइल खोलता है। आपको फ़ाइल की सामग्री को मेमोरी में पढ़ने की आवश्यकता होगी, लेकिन निश्चित रूप से आप फ़ाइल के आकार को पहले से नहीं जानते हैं, क्योंकि उपयोगकर्ता रनटाइम पर फ़ाइल का चयन करता है। इसलिए मूल रूप से आपको उस malloc
समय की आवश्यकता होती है जब आप उस डेटा का आकार नहीं जानते हैं जो आप पहले से काम कर रहे हैं। कम से कम इसका उपयोग करने के मुख्य कारणों में से एक है malloc
। आपके उदाहरण में एक साधारण स्ट्रिंग के साथ, जिसे आप पहले से ही संकलन समय के आकार के साथ जानते हैं (साथ ही आप इसे संशोधित नहीं करना चाहते हैं), यह गतिशील रूप से आवंटित करने के लिए बहुत मायने नहीं रखता है।
थोड़ा ऑफ-टॉपिक, लेकिन ... आपको बहुत सावधानी बरतनी होगी कि उपयोग करते समय मेमोरी लीक न हो malloc
। इस कोड पर विचार करें:
int do_something() {
uint8_t* someMemory = (uint8_t*)malloc(1024);
// Do some stuff
if ( /* some error occured */ ) return -1;
// Do some other stuff
free(someMemory);
return result;
}
क्या आप देखते हैं कि इस कोड में क्या गलत है? वहाँ के बीच एक सशर्त वापसी कथन है malloc
और free
। यह पहली बार में ठीक लग सकता है, लेकिन इसके बारे में सोचें। यदि कोई त्रुटि है, तो आप आवंटित की गई मेमोरी को मुक्त किए बिना वापस लौटने वाले हैं। यह मेमोरी लीक का एक सामान्य स्रोत है।
बेशक यह एक बहुत ही सरल उदाहरण है, और यहां गलती को देखना बहुत आसान है, लेकिन पॉइंटर्स, malloc
एस, free
एस और सभी प्रकार की त्रुटि से निपटने के साथ कोड की सैकड़ों लाइनों की कल्पना करें । चीजें वास्तव में बहुत तेजी से गड़बड़ हो सकती हैं। यह उन कारणों में से एक है जो मैं लागू मामलों में C पर आधुनिक C ++ को पसंद करता हूं, लेकिन यह एक संपूर्ण नोटेर विषय है।
इसलिए जब भी आप उपयोग करते हैं malloc
, तो हमेशा सुनिश्चित करें कि आपकी मेमोरी free
यथासंभव घनी हो।
malloc()
विफल हो सकते हैं!