पाठ 30 / 38
मेमोरी लीक और डैंगलिंग पॉइंटर
हर allocation को ठीक एक free के साथ जोड़कर memory leaks और dangling pointers से बचें।
लीक: वह मेमोरी जिस तक आप कभी नहीं पहुँच सकते
अगर आप malloc किए ब्लॉक के इकलौते पॉइंटर को बिना free किए ओवरराइट या खो देते हैं, तो वह मेमोरी हमेशा के लिए आरक्षित रह जाती है — यही मेमोरी लीक है। लंबे समय तक चलने वाले प्रोग्राम (सर्वर, गेम) बार-बार लीक होने पर आखिरकार मेमोरी खत्म कर देते हैं।
डैंगलिंग पॉइंटर
free के बाद, पॉइंटर पुराना एड्रेस ही रखता है — उसका उपयोग करना अनिर्धारित व्यवहार है, भले ही कंपाइलर आपको न रोके।
int *p = malloc(sizeof(int));
*p = 42;
free(p);
printf("%d\n", *p); // BUG: use-after-free
p = NULL; // now safe: NULL is checkableआम नियम
हर malloc/calloc का बिल्कुल एक ही matching free होना चाहिए। free करने के तुरंत बाद पॉइंटर को NULL सेट करें ताकि गलती से दोबारा उपयोग चुपचाप मेमोरी करप्ट करने के बजाय साफ़ तौर पर विफल हो।
त्वरित जाँच: किसी पॉइंटर पर free() कॉल करने के तुरंत बाद आपको क्या करना चाहिए?
- उस पर दोबारा free() कॉल करें
- उसे NULL सेट करें
- कुछ नहीं, इसे उपयोग करते रहना ठीक है
- उसे void में cast करें
Answer
उसे NULL सेट करें — NULL सेट करने से गलती से use-after-free बग नहीं होता।