पाठ 29 / 36

मेमोरी लीक और डैंगलिंग पॉइंटर

heap मेमोरी सावधानी से न संभालने पर क्या गलत होता है।

लीक: वह मेमोरी जिस तक आप कभी नहीं पहुँच सकते

अगर आप 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() कॉल करने के तुरंत बाद आपको क्या करना चाहिए?

  • उसे NULL सेट करें
  • उस पर दोबारा free() कॉल करें
  • कुछ नहीं, इसे उपयोग करते रहना ठीक है
Answer

उसे NULL सेट करें — NULL सेट करने से गलती से use-after-free बग नहीं होता।