Memory Leaks
Leaks खोजें और उनसे बचें
Memory Leaks, CoddyKit पर C Academy का एक निःशुल्क पाठ है। यह 4 में से 3वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह C Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। C Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
मेमोरी लीक क्या है
मेमोरी लीक तब होता है जब आप हीप मेमोरी आवंटित करते हैं, लेकिन उसे कभी मुक्त नहीं करते और उसका एकमात्र पॉइंटर खो देते हैं।
प्रोग्राम बंद होने तक मेमोरी आरक्षित रहती है और संसाधन व्यर्थ होते हैं।
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int *p = malloc(sizeof(int));
*p = 5;
printf("%d\n", *p);
free(p);
return 0;
}पॉइंटर खो देना
सामान्य लीक तब होता है जब पुराने आवंटन को मुक्त करने से पहले पॉइंटर को नए आवंटन से अधिलेखित कर दिया जाता है।
पहला ब्लॉक अप्राप्य हो जाता है।
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int *p = malloc(sizeof(int));
free(p);
p = malloc(sizeof(int));
*p = 10;
printf("%d\n", *p);
free(p);
return 0;
}लूप में लीक
हर पुनरावृत्ति में मुक्त किए बिना लूप के अंदर आवंटन करने पर लीक तेज़ी से बढ़ता है।
अगली पुनरावृत्ति में पॉइंटर के अधिलेखित होने से पहले उसे मुक्त करना इसका समाधान है।
#include <stdio.h>
#include <stdlib.h>
int main(void) {
for (int i = 0; i < 3; i++) {
int *p = malloc(sizeof(int));
*p = i;
printf("%d ", *p);
free(p);
}
printf("\n");
return 0;
}जल्दी लौटने पर लीक
आवंटन के बाद जल्दी किया गया return सफ़ाई को छोड़ सकता है। हर निकास पथ पर मेमोरी अवश्य मुक्त कीजिए।
#include <stdio.h>
#include <stdlib.h>
int process(int bad) {
int *p = malloc(sizeof(int));
if (bad) {
free(p);
return -1;
}
*p = 42;
int r = *p;
free(p);
return r;
}
int main(void) {
printf("%d\n", process(0));
return 0;
}goto से सफ़ाई का तरीका
goto से पहुँचने वाला एकल सफ़ाई लेबल यह सुनिश्चित करता है कि सब कुछ मुक्त करने की एक ही जगह हो और दोहराए गए free कॉल से बचा जा सके।
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int rc = 1;
int *p = malloc(sizeof(int));
if (!p) goto done;
*p = 7;
printf("%d\n", *p);
rc = 0;
done:
free(p);
return rc;
}हर आवंटन का मिलान कीजिए
सबसे सरल नियम: प्रत्येक malloc, calloc या realloc के लिए ठीक एक संबंधित free होना चाहिए।
#include <stdio.h>
#include <stdlib.h>
int main(void) {
char *a = malloc(8);
char *b = calloc(4, sizeof(char));
a[0] = 'x';
printf("%c %d\n", a[0], b[0]);
free(a);
free(b);
return 0;
}नेस्टेड आवंटन मुक्त करना
यदि कोई संरचना हीप मेमोरी की स्वामी है, तो बाहरी ब्लॉक को मुक्त करने से पहले अंदर के पॉइंटर मुक्त कीजिए।
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int *data;
} Box;
int main(void) {
Box *b = malloc(sizeof(Box));
b->data = malloc(3 * sizeof(int));
b->data[0] = 1;
printf("%d\n", b->data[0]);
free(b->data);
free(b);
return 0;
}पॉइंटरों के ऐरे को मुक्त करना
जब आप पॉइंटरों का ऐरे आवंटित करते हैं और प्रत्येक प्रविष्टि का अपना आवंटन होता है, तो पहले हर प्रविष्टि को और फिर ऐरे को मुक्त कीजिए।
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int n = 3;
int **rows = malloc(n * sizeof(int *));
for (int i = 0; i < n; i++) {
rows[i] = malloc(2 * sizeof(int));
rows[i][0] = i;
}
for (int i = 0; i < n; i++) free(rows[i]);
free(rows);
printf("freed all rows\n");
return 0;
}स्वामित्व का अनुशासन
तय कीजिए कि प्रत्येक आवंटन का स्वामी कौन है और उसे मुक्त करने की ज़िम्मेदारी किसकी है। इसे दस्तावेज़ित कीजिए, ताकि कॉल करने वालों को पता हो कि लौटाए गए पॉइंटर को मुक्त करना है या नहीं।
#include <stdio.h>
#include <stdlib.h>
char *make_greeting(void) {
char *s = malloc(6);
s[0]='h'; s[1]='i'; s[2]='\0';
return s;
}
int main(void) {
char *g = make_greeting();
printf("%s\n", g);
free(g);
return 0;
}लीक खोजने वाले साधन
Valgrind और AddressSanitizer जैसे साधन प्रत्येक आवंटन पर नज़र रखकर और जो कभी मुक्त नहीं हुए उन्हें दिखाकर लीक की सूचना देते हैं।
वास्तविक प्रोग्रामों की जाँच के लिए ये आवश्यक हैं।
साफ़-सुथरा आवंटन जीवनचक्र
पूरी प्रक्रिया इस प्रकार है: आवंटित कीजिए, जाँचिए, इस्तेमाल कीजिए, हर पथ पर मुक्त कीजिए और पॉइंटर को NULL कीजिए। इससे प्रोग्राम लीक-मुक्त रहते हैं।
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int *p = malloc(4 * sizeof(int));
if (!p) return 1;
for (int i = 0; i < 4; i++) p[i] = i + 1;
int sum = 0;
for (int i = 0; i < 4; i++) sum += p[i];
printf("sum = %d\n", sum);
free(p);
p = NULL;
return 0;
}त्वरित जाँच
मेमोरी लीक की अपनी समझ की जाँच कीजिए।
पुनरावृत्ति
आपने मेमोरी लीक रोकना सीखा:
- हर आवंटन का ठीक एक
freeसे मिलान कीजिए। - जल्दी लौटने और त्रुटियों सहित, हर निकास पथ पर मेमोरी मुक्त कीजिए।
- नेस्टेड तथा पॉइंटर-ऐरे वाले आवंटनों को अंदर से बाहर की ओर मुक्त कीजिए।
- स्पष्ट स्वामित्व निर्धारित कीजिए और जाँच के लिए Valgrind जैसे साधनों का इस्तेमाल कीजिए।
एआई शिक्षक के साथ C सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 39
- पाठ
- 144
अक्सर पूछे जाने वाले प्रश्न
क्या “Memory Leaks” पाठ निःशुल्क है?
हाँ—“Memory Leaks” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और C Academy पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। C Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“Memory Leaks” में मैं क्या सीखूँगा?
Leaks खोजें और उनसे बचें आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ C Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या C Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर C Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 3वाँ पाठ है।
“Memory Leaks” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस C Academy पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर C Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- malloc और free
- calloc और realloc
- Memory Leaks
- Dangling Pointers