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