C Academy · पाठ

Leaks का पता लगाना

memcheck की मूल बातें

पाठ 2, कुल 4 में से13 चरण

Leaks का पता लगाना, CoddyKit पर C Academy का एक निःशुल्क पाठ है। यह 4 में से 2वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह C Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। C Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

लीक क्या होता है

मेमोरी लीक तब होता है जब आप malloc, calloc या realloc से HEAP मेमोरी आवंटित करते हैं और free कॉल करने से पहले उसके सभी पॉइंटर खो देते हैं।

प्रक्रिया समाप्त होने तक ब्लॉक आरक्षित रहता है, लेकिन उस तक पहुँचा नहीं जा सकता। लंबे समय तक चलने वाले प्रोग्रामों में लीक जमा होते रहते हैं और अंततः मेमोरी समाप्त हो जाती है।

एक न्यूनतम लीक

यह प्रोग्राम 40 बाइट का एक ब्लॉक लीक करता है।

पॉइंटर p एक स्थानीय variable है। जब main लौटता है, तो p गायब हो जाता है, लेकिन जिस HEAP ब्लॉक की ओर वह संकेत कर रहा था, वह कभी मुक्त नहीं होता।

#include <stdlib.h>

int main(void) {
    int *p = malloc(10 * sizeof(int));
    p[0] = 1;
    return 0; /* never free(p) */
}

memcheck चलाना

memcheck डिफ़ॉल्ट टूल है, इसलिए आप टूल का नाम छोड़ सकते हैं।

हर लीक किए गए आवंटन का स्टैक ट्रेस पाने के लिए --leak-check=full जोड़ें।

gcc -g -O0 -o leak leak.c
valgrind --leak-check=full ./leak

लीक का सारांश

समाप्ति पर Valgrind एक LEAK SUMMARY प्रिंट करता है। ऊपर दिए गए प्रोग्राम के लिए यह लगभग ऐसा दिखाई देता है:

definitely lost: 40 bytes in 1 blocks

ट्रेस सटीक malloc कॉल स्थान की ओर संकेत करता है, इसलिए आपको ठीक-ठीक पता होता है कि कौन-सा आवंटन कभी मुक्त नहीं हुआ।

लीक की चार श्रेणियाँ

memcheck खोई हुई मेमोरी को चार श्रेणियों में बाँटता है:

  • definitely lost — कोई पॉइंटर शेष नहीं; वास्तविक लीक
  • indirectly lost — केवल definitely-lost ब्लॉक के माध्यम से पहुँच योग्य
  • possibly lost — केवल अंदरूनी पॉइंटर शेष
  • still reachable — समाप्ति पर पॉइंटर मौजूद है, लेकिन आपने उसे मुक्त नहीं किया

Definitely lost बनाम Still reachable

definitely lost सबसे अधिक तात्कालिक श्रेणी है: प्रोग्राम के चलते समय उन बाइटों को कभी वापस प्राप्त नहीं किया जा सकता।

still reachable कम गंभीर है। समाप्ति पर ब्लॉक लीक होता है, लेकिन कोई वैश्विक या static पॉइंटर अब भी उसका संदर्भ रखता है; इसलिए यह आमतौर पर ऐसा एक-बार का आवंटन होता है जिसे आपने मुक्त करने की ज़रूरत ही नहीं समझी।

अप्रत्यक्ष लीक

जब आप किसी लिंक की गई संरचना का head खो देते हैं, तो हर node पहुँच से बाहर हो जाता है।

head को definitely lost और बाकी को indirectly lost दिखाया जाता है। मूल कारण, यानी खोए हुए head, को ठीक करने पर सब कुछ वापस प्राप्त हो जाता है।

struct Node { int v; struct Node *next; };

struct Node *make(void) {
    struct Node *h = malloc(sizeof *h);
    h->next = malloc(sizeof *h);
    h->next->next = NULL;
    return h;
}
/* if the caller drops the returned head, both nodes leak */

सुधरा हुआ संस्करण

जिसे आवंटित करें, उसे मुक्त करें। यह संस्करण कुछ भी लीक नहीं करता।

Valgrind के अंतर्गत यह All heap blocks were freed -- no leaks are possible रिपोर्ट करता है।

#include <stdlib.h>

int main(void) {
    int *p = malloc(10 * sizeof(int));
    p[0] = 1;
    free(p);
    return 0;
}

आवंटनों की गिनती

लीक न होने पर भी HEAP SUMMARY बताता है कि आपका प्रोग्राम कितना व्यस्त था:

total heap usage: 1 allocs, 1 frees, 40 bytes allocated

जब allocs और frees की संख्या समान होती है, तो रन साफ़ होता है। असमानता इस बात का पहला संकेत है कि कुछ छूट गया।

पहुँच योग्य ब्लॉक दिखाना

डिफ़ॉल्ट रूप से memcheck still reachable ब्लॉकों को विस्तार से सूचीबद्ध नहीं करता। उनकी भी जाँच करने के लिए यह जोड़ें:

--show-leak-kinds=all

इससे हर श्रेणी के लिए ट्रेस मिलता है। यह तब उपयोगी है जब आप ऐसा प्रोग्राम चाहते हैं जो समाप्ति से पहले हर चीज़ को पूरी तरह मुक्त कर दे।

valgrind --leak-check=full --show-leak-kinds=all ./leak

त्रुटि वाले पथों पर लीक

सबसे छिपे हुए लीक जल्दी लौटने वाले पथों पर होते हैं। यहाँ, यदि दूसरा आवंटन विफल हो जाता है, तो पहला ब्लॉक लीक हो जाता है।

सामान्य परीक्षण में इन शाखाओं तक पहुँचना दुर्लभ होता है, लेकिन पथ चलने पर memcheck उन्हें पकड़ लेता है। त्रुटि पर लौटने से पहले अपने पास मौजूद हर चीज़ को हमेशा मुक्त करें।

char *a = malloc(100);
char *b = malloc(100);
if (!b) {
    /* bug: a is leaked here */
    return -1;
}
/* fix: free(a); before returning */

त्वरित जाँच

वह लीक श्रेणी चुनें जिस पर सबसे तत्काल ध्यान देना आवश्यक है।

पुनरावलोकन

अब आप memcheck से लीक का पता लगा सकते हैं:

  • -g वाली बाइनरी पर valgrind --leak-check=full ./prog चलाएँ
  • LEAK SUMMARY और HEAP SUMMARY पढ़ें
  • definitely lost को प्राथमिकता दें, फिर अप्रत्यक्ष लीक का मूल कारण खोजें
  • still-reachable ब्लॉकों की जाँच के लिए --show-leak-kinds=all का उपयोग करें

अगला विषय: अमान्य मेमोरी पहुँच।

शुरुआत निःशुल्क

एआई शिक्षक के साथ C सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
39
पाठ
144

अक्सर पूछे जाने वाले प्रश्न

क्या “Leaks का पता लगाना” पाठ निःशुल्क है?

हाँ—“Leaks का पता लगाना” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और C Academy पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। C Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“Leaks का पता लगाना” में मैं क्या सीखूँगा?

memcheck की मूल बातें आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ C Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या C Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर C Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 2वाँ पाठ है।

“Leaks का पता लगाना” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस C Academy पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर C Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. Valgrind क्यों
  2. Leaks का पता लगाना
  3. Invalid Access
  4. Reports पढ़ना
← C Academy पर वापस जाएँ