একটি স্থানীয় ভেরিয়েবল একবার সুযোগের বাইরে চলে গেলে আপনি অ্যাক্সেস করতে পারবেন না৷ এটি একটি স্থানীয় পরিবর্তনশীল হতে মানে কি. যদিও, আসুন একটি উদাহরণ দেখি যেখানে আপনি একটি স্থানীয় ভেরিয়েবলের মেমরিকে এর সুযোগের বাইরে অ্যাক্সেস করতে সক্ষম হতে পারেন৷
উদাহরণ
#include<iostream> int* foo() { int x = 3; return &x; } int main() { int* address = foo(); cout << *address; *address = 12; cout << *address; }
আউটপুট
এটি আউটপুট দিতে পারে −
3 12
আমি আগে উল্লেখ করেছি, এই কোড কাজ করতে পারে. আমরা কেবল মেমরিতে পড়ছি এবং লিখছি যা x এর ঠিকানা হিসাবে ব্যবহৃত হয়। প্রধানত, আপনি foo এর সুযোগের বাইরে আছেন, ঠিকানাটি কিছু র্যান্ডম মেমরি এলাকায় একটি নির্দেশক। উপরের উদাহরণে, সেই মেমরি ক্ষেত্রটি বিদ্যমান এবং অন্য কিছুই এই মুহূর্তে এটি ব্যবহার করছে না। আপনি এটি ব্যবহার চালিয়ে যাওয়ার মাধ্যমে কিছু ভাঙবেন না (আপনি অন্য প্রক্রিয়ার মেমরি এলাকা বা অন্য কোনো অননুমোদিত মেমরি এলাকা ব্যবহার করবেন না), এবং অন্য কিছুই এটিকে ওভাররাইট করেনি। তাই, 3টি এখনও সেখানে আছে৷
৷একটি বাস্তব প্রোগ্রাম, যে মেমরি প্রায় অবিলম্বে পুনরায় ব্যবহার করা হতে পারে এবং আপনি কিছু ভাঙ্গা চাই এই মত কিছু দ্বারা. এই ধরনের মেমরি অ্যাক্সেস বাগগুলি ট্র্যাক করা এবং মেরে ফেলা খুব কঠিন৷
৷আপনি যখন foo থেকে ফিরে আসেন, প্রোগ্রামটি OS কে বলে যে x এর মেমরি আর ব্যবহার করা হচ্ছে না এবং এটি অন্য কিছুতে পুনরায় নিয়োগ করা যেতে পারে। আপনি যদি ভাগ্যবান হন এবং এটি পুনরায় বরাদ্দ করা হয়, এবং OS এটিকে আবার ব্যবহার করে আপনাকে ধরতে না পারে, তাহলে আপনি এটি থেকে দূরে যেতে পারেন৷