realloc
पर्दे के पीछे काम करता है मोटे तौर पर इस तरह:
- अगर वहाँ वर्तमान ब्लॉक के पीछे पर्याप्त खाली स्थान अनुरोध को पूरा करने के लिए है, वर्तमान ब्लॉक का विस्तार करने और ब्लॉक की शुरुआत करने के लिए एक सूचक वापसी ।
वरना
- अगर वहाँ एक बड़ा पर्याप्त मुक्त ब्लॉक कहीं और है, तो उस ब्लॉक का आवंटन, वर्ष से अधिक ब्लॉक से डेटा कॉपी, पुराने ब्लॉक मुक्त और से नए ब्लॉक
- वरना रिपोर्ट विफलता की शुरुआत करने के लिए एक सूचक वापसी
NULL
लौट रहा है।
तो, आप NULL
के लिए परीक्षण द्वारा विफलता के लिए परीक्षण कर सकते हैं, लेकिन ध्यान रखें कि आप पुराने सूचक बहुत जल्दी ऊपर लिख नहीं करते:
int* p = malloc(x);
/* ... */
p = realloc(p, y); /* WRONG: Old pointer lost if realloc fails: memory leak! */
/* Correct way: */
{
int* temp = realloc(p, y);
if (NULL == temp)
{
/* Handle error; p is still valid */
}
else
{
/* p now possibly points to deallocated memory. Overwrite it with the pointer
to the new block, to start using that */
p = temp;
}
}
स्रोत
2010-09-10 11:55:50
क्या यह सभी कार्यान्वयन के लिए 'realloc' काम करता है? –
@CoolGuy: कुछ कार्यान्वयन मौजूदा ब्लॉक को विस्तारित करने के पहले चरण को करने में सक्षम नहीं हो सकते हैं, लेकिन अन्यथा यह सभी कार्यान्वयन के लिए 'realloc' का अवलोकन योग्य व्यवहार है। –