मैं झूलने वाले सूचक और स्मृति रिसाव के बीच का अंतर नहीं समझता। ये दो पद कैसे संबंधित हैं?
मैं झूलने वाले सूचक और स्मृति रिसाव के बीच का अंतर नहीं समझता। ये दो पद कैसे संबंधित हैं?
जवाबों:
एक झूलने वाला सूचक स्मृति को इंगित करता है जिसे पहले ही मुक्त किया जा चुका है। भंडारण अब आवंटित नहीं किया गया है। इसे एक्सेस करने की कोशिश करने से सेगमेंटेशन फॉल्ट हो सकता है।
झूलने वाले सूचक के साथ समाप्त होने का सामान्य तरीका:
char *func()
{
char str[10];
strcpy(str, "Hello!");
return str;
}
//returned pointer points to str which has gone out of scope.
आप एक पता लौटा रहे हैं, जो एक स्थानीय चर था, जिसे कॉलिंग फ़ंक्शन पर समय नियंत्रण द्वारा दायरे से बाहर कर दिया गया होगा। (अपरिभाषित व्यवहार)
एक अन्य आम झूलने वाला सूचक उदाहरण सूचक के माध्यम से एक मेमोरी स्थान की पहुंच है, मुफ्त के बाद स्पष्ट रूप से उस मेमोरी पर कॉल किया जाता है।
int *c = malloc(sizeof(int));
free(c);
*c = 3; //writing to freed location!
एक स्मृति रिसाव स्मृति है जिसे मुक्त नहीं किया गया है, अब इसे एक्सेस करने (या इसे मुक्त) करने का कोई तरीका नहीं है, क्योंकि अब इसे प्राप्त करने के लिए कोई रास्ता नहीं है। (उदाहरण के लिए एक सूचक जो था केवल एक स्मृति स्थान के संदर्भ में गतिशील रूप से आवंटित (और मुक्त नहीं) जो अंक अब कहीं और।)
void func(){
char *ch = malloc(10);
}
//ch not valid outside, no way to access malloc-ed memory
चार-पीटीआर च एक स्थानीय चर है जो फ़ंक्शन के अंत में दायरे से बाहर हो जाता है, गतिशील रूप से आवंटित 10 बाइट्स को लीक करता है ।
आप इन्हें एक दूसरे के विरोधी के रूप में सोच सकते हैं।
जब आप स्मृति के एक क्षेत्र को मुक्त करते हैं, लेकिन फिर भी इसके लिए एक संकेतक रखें, तो वह सूचक झूल रहा है:
char *c = malloc(16);
free(c);
c[1] = 'a'; //invalid access through dangling pointer!
जब आप पॉइंटर खो देते हैं, लेकिन मेमोरी को आबंटित रखते हैं, तो आपके पास मेमोरी लीक होती है:
void myfunc()
{
char *c = malloc(16);
} //after myfunc returns, the the memory pointed to by c is not freed: leak!
एक झूलते सूचक एक एक मूल्य (नहीं NULL) जो कुछ स्मृति जो वस्तु के प्रकार आप उम्मीद कर लिए मान्य नहीं है को संदर्भित करता है है। उदाहरण के लिए यदि आप किसी ऑब्जेक्ट के लिए एक पॉइंटर सेट करते हैं तो उस मेमोरी को किसी और चीज से असंबंधित या मेमोरी को ओवरराइड कर देता है यदि यह डायनामिक रूप से आवंटित किया गया था।
एक स्मृति रिसाव है जब आप गतिशील रूप से ढेर से मेमोरी आवंटित करते हैं, लेकिन इसे कभी भी मुक्त नहीं करते हैं, संभवतः इसलिए क्योंकि आपने इसके सभी संदर्भ खो दिए हैं।
वे इस बात से संबंधित हैं कि वे दोनों कुप्रबंधित बिंदुओं से संबंधित हैं, विशेष रूप से गतिशील रूप से आवंटित स्मृति से संबंधित हैं। एक स्थिति में (झूलने वाला सूचक) आपने स्मृति को मुक्त कर दिया है, लेकिन बाद में इसे संदर्भित करने का प्रयास किया है; अन्य (मेमोरी लीक) में, आप मेमोरी को पूरी तरह से मुक्त करना भूल गए हैं!
डंकलिंग पॉइंटर
यदि कोई पॉइंटर किसी वैरिएबल के मैमोरी एड्रेस को इंगित कर रहा है लेकिन कुछ वैरिएबल के बाद उस मैमोरी लोकेशन से डिलीट हो गया है जबकि पॉइंटर अभी भी आपके मैमोरी लोकेशन को इंगित कर रहा है। ऐसे पॉइंटर को डैंगलिंग पॉइंटर के रूप में जाना जाता है और इस समस्या को डैंगलिंग पॉइंटर समस्या के रूप में जाना जाता है।
#include<stdio.h>
int *call();
void main(){
int *ptr;
ptr=call();
fflush(stdin);
printf("%d",*ptr);
}
int * call(){
int x=25;
++x;
return &x;
}
आउटपुट: कचरा मूल्य
नोट: कुछ संकलक में आपको स्थानीय चर या अस्थाई का चेतावनी संदेश लौटने का पता मिल सकता है
स्पष्टीकरण: चर x स्थानीय चर है। इसका दायरा और जीवनकाल फंक्शन कॉल के भीतर है इसलिए एक्स वेरिएबल का पता लौटने के बाद x मृत हो गया और पॉइंटर अभी भी इंगित कर रहा है ptr अभी भी उस स्थान की ओर इशारा कर रहा है।
इस समस्या का समाधान: वैरिएबल x को स्थिर वैरिएबल के रूप में बनाएं। दूसरे शब्द में हम एक पॉइंटर कह सकते हैं जिसकी पॉइंटिंग ऑब्जेक्ट को हटा दिया गया है जिसे डैंगलिंग पॉइंटर कहा जाता है।
स्मृति रिसाव
कंप्यूटर विज्ञान में, स्मृति रिसाव तब होता है जब कंप्यूटर प्रोग्राम गलत तरीके से मेमोरी आवंटन का प्रबंधन करता है। सरल के अनुसार हमने मेमोरी आवंटित की है न कि फ्री अन्य लैंग्वेज टर्म का कहना है कि इसे मेमोरी लीक न कहें, यह एप्लिकेशन और अप्रत्याशित दुर्घटना के लिए घातक है।
पॉइंटर एक चर के लिए उपयोगकर्ता परिभाषित गुंजाइश बनाने में मदद करता है, जिसे डायनामिक चर कहा जाता है। गतिशील चर एकल चर या एक ही प्रकार के चर का समूह हो सकता है ( array) या विभिन्न प्रकार के चर का समूह ( struct)। डिफ़ॉल्ट स्थानीय चर गुंजाइश तब शुरू होती है जब नियंत्रण एक फ़ंक्शन में प्रवेश करता है और जब नियंत्रण उस फ़ंक्शन से बाहर आता है तो समाप्त होता है। डिफ़ॉल्ट ग्लोबल वियरेबल स्कोप प्रोग्राम के निष्पादन पर शुरू होता है और एक बार प्रोग्राम खत्म होने के बाद समाप्त होता है।
लेकिन एक डायनामिक वैरिएबल का स्कोप जो एक पॉइंटर के द्वारा होता है, प्रोग्राम के निष्पादन में किसी भी बिंदु पर शुरू और समाप्त हो सकता है, जिसे प्रोग्रामर द्वारा तय किया जाना है। यदि कोई प्रोग्रामर स्कोप स्कोप के अंत को हैंडल नहीं करता है, तो डेंग्लिंग और मेमोरी लीक तस्वीर में आता है।
यदि कोई प्रोग्रामर, freeडायनेमिक चर के लिए गुंजाइश के अंत के लिए कोड ( पॉइंटर का) नहीं लिखता है तो मेमोरी लीक हो जाएगी । किसी भी तरह से एक बार प्रोग्राम पूरी तरह से बाहर हो जाने के बाद मेमोरी को मुक्त कर दिया जाएगा, उस समय यह लीक्ड मेमोरी भी फ्री हो जाएगी। लेकिन यह एक प्रक्रिया के लिए बहुत गंभीर समस्या पैदा करेगा जो लंबे समय से चल रहा है।
डायनामिक वैरिएबल का स्कोप समाप्त होने (मुक्त होने) के बाद, NULLपॉइंटर वैरिएबल को सौंपा जाना चाहिए। अन्यथा यदि कोड गलत तरीके से पहुंचता है तो अपरिभाषित व्यवहार होगा। तो डैंगलिंग पॉइंटर और कुछ नहीं बल्कि एक पॉइंटर है जो एक डायनामिक वैरिएबल की ओर इशारा कर रहा है जिसका स्कोप पहले ही खत्म हो चुका है।
मेमोरी रिसाव : जब एक ढेर में एक स्मृति क्षेत्र होता है लेकिन स्टैक में कोई चर उस मेमोरी की ओर इशारा नहीं करता है।
char *myarea=(char *)malloc(10);
char *newarea=(char *)malloc(10);
myarea=newarea;
डैंग्लिंग पॉइंटर : जब एक स्टैक में एक पॉइंटर चर लेकिन ढेर में कोई मेमोरी नहीं है।
char *p =NULL;
अंतरिक्ष को आवंटित किए बिना डेरेन्फेरेंस करने की कोशिश करने वाले झूलने वाले पॉइंटर से विभाजन में गलती होगी।
एक मेमोरी स्थान को इंगित करने वाला एक संकेतक जिसे हटा दिया गया है (या मुक्त किया गया है) को लटकन सूचक कहा जाता है।
#include <stdlib.h>
#include <stdio.h>
void main()
{
int *ptr = (int *)malloc(sizeof(int));
// After below free call, ptr becomes a
// dangling pointer
free(ptr);
}
एक मेमोरी स्थान को इंगित करने वाला एक संकेतक जिसे हटा दिया गया है (या मुक्त किया गया है) को लटकन सूचक कहा जाता है। तीन अलग-अलग तरीके हैं जहां पॉइंटर लटकने वाले पॉइंटर के रूप में कार्य करता है।
- स्मृति का डी-आवंटन
- फंक्शन कॉल
- चर दायरे से बाहर हो जाता है
—— https://www.geeksforgeeks.org/dangling-void-null-wild-pointers/ से