आइए एक ऐसा उदाहरण देखते हैं जहां आप संभवतः किसी लोकल वेरिएबल की मेमोरी को उसके स्कोप के बाहर एक्सेस कर सकते हैं।
उदाहरण
#include <iostream>
int* foo() {
int x = 3;
return &x;
}
int main() {
int* address = foo();
cout << *address;
*address = 12;
cout << *address;
}
आउटपुट
इसका आउटपुट संभवतः हो सकता है –
3 12
जैसा कि मैंने पहले बताया, यह कोड काम कर सकता है। हम बस उस मेमोरी को पढ़ और लिख रहे हैं जो पहले x का एड्रेस थी। main में, आप foo के स्कोप से बाहर हैं, यह एड्रेस किसी रैंडम मेमोरी एरिया का पॉइंटर है। उपरोक्त उदाहरण में, वह मेमोरी एरिया मौजूद है और फिलहाल कोई अन्य उसका उपयोग नहीं कर रहा। आप उसका उपयोग जारी रखकर कुछ भी नहीं तोड़ते (आप किसी अन्य प्रोसेस की मेमोरी या अनधिकृत मेमोरी एरिया का उपयोग नहीं कर रहे), और अभी तक किसी ने उसे ओवरराइट नहीं किया है। इसलिए 3 अभी भी वहीं है।
एक वास्तविक प्रोग्राम में, उस मेमोरी को लगभग तुरंत पुनः उपयोग किया जा सकता है और ऐसा करने से आप कुछ न कुछ तोड़ देंगे। ऐसे मेमोरी एक्सेस बग्स को ट्रैक करना और ठीक करना बहुत मुश्किल होता है।
जब आप foo से रिटर्न होते हैं, तो प्रोग्राम OS को बताता है कि x की मेमोरी अब उपयोग में नहीं है और इसे किसी और चीज़ के लिए पुनः असाइन किया जा सकता है। यदि आप भाग्यशाली हैं और इसे पुनः असाइन नहीं किया गया है, और OS आपको इसे फिर से उपयोग करते हुए नहीं पकड़ता, तो आप इससे बच सकते हैं।