এটা কিভাবে হতে পারে? স্থানীয় ভেরিয়েবলের স্মৃতি কি এর কার্যকারিতার বাইরে অ্যাক্সেসযোগ্য নয়?
আপনি একটি হোটেল রুম ভাড়া। আপনি বিছানার টেবিলের শীর্ষ ড্রয়ারে একটি বই রেখে ঘুমোতে যান। আপনি পরের দিন সকালে পরীক্ষা করে দেখুন, তবে আপনার কীটি ফিরিয়ে দিতে "ভুলে যান"। তুমি চাবি চুরি কর!
এক সপ্তাহ পরে, আপনি হোটেলে ফিরে যাবেন, চেক ইন করবেন না, আপনার চুরি হওয়া চাবিটি দিয়ে আপনার পুরানো ঘরে neুকুন এবং ড্রয়ারটি দেখুন। আপনার বই এখনও আছে। বিস্ময়কর!
যথোপযুক্ত সৃষ্টিকর্তা? হোটেল রুমের ড্রয়ারের সামগ্রীগুলি কি অ্যাক্সেসযোগ্য নয় যদি আপনি ঘরটি ভাড়া না নেন?
ঠিক আছে, স্পষ্টতই যে দৃশ্যটি বাস্তব বিশ্বে ঘটতে পারে কোনও সমস্যা নেই। এমন কোনও রহস্যময় শক্তি নেই যা আপনার ঘরে authorizedুকতে অনুমতিপ্রাপ্ত না হলে আপনার বইটি অদৃশ্য হয়ে যায়। বা এমন কোনও রহস্যময় শক্তি নেই যা আপনাকে কোনও চুরির চাবি দিয়ে ঘরে প্রবেশ করতে বাধা দেয়।
আপনার বইটি সরানোর জন্য হোটেল পরিচালনার প্রয়োজন নেই । আপনি তাদের সাথে কোনও চুক্তি করেন নি যা বলেছিল যে আপনি যদি জিনিসগুলি পিছনে ফেলে রাখেন তবে তারা তা আপনার জন্য ছড়িয়ে দেবে। যদি আপনি আপনার ঘরে চুরির চাবিটি অবৈধভাবে পুনরায় প্রবেশের জন্য পুনরায় প্রবেশ করেন তবে হোটেল সুরক্ষা কর্মীদের আপনাকে লুক্কায়িত হতে ধরতে হবে না You রুম পরে, আপনি আমাকে থামানো প্রয়োজন। " বরং আপনি তাদের সাথে একটি চুক্তি স্বাক্ষর করেছিলেন যাতে বলা হয়েছিল "আমি প্রতিশ্রুতি দিচ্ছি যে পরে আমার ঘরে neুকবে না", যে চুক্তিটি আপনি ভেঙে দিয়েছিলেন ।
এই পরিস্থিতিতে কিছু ঘটতে পারে । বইটি সেখানে থাকতে পারে - আপনি ভাগ্যবান হয়েছেন। অন্য কারও বই থাকতে পারে এবং আপনার হোটেলের চুল্লীতে থাকতে পারে। আপনার বইটি টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো হোটেলটি টেবিল এবং বইটি পুরোপুরি সরিয়ে ফেলতে এবং এটি একটি ওয়ারড্রোব দিয়ে প্রতিস্থাপন করতে পারে। পুরো হোটেলটি প্রায় ছিন্নভিন্ন হয়ে ফুটবল স্টেডিয়ামের সাথে প্রতিস্থাপিত হতে পারে এবং আপনি যখন চারপাশে লুকিয়ে ছিলেন তখন আপনি একটি বিস্ফোরণে মারা যাবেন।
আপনি কি জানেন যে কি ঘটতে চলেছে; আপনি যখন হোটেলটি পরীক্ষা করে দেখেছেন এবং পরে অবৈধভাবে ব্যবহারের জন্য কীটি চুরি করেছেন, তখন আপনি ভবিষ্যদ্বাণীপূর্ণ, নিরাপদ বিশ্বে বাঁচার অধিকার ছেড়ে দিয়েছেন কারণ আপনি সিস্টেমের নিয়মগুলি ভঙ্গ করতে বেছে নিয়েছেন ।
সি ++ কোনও নিরাপদ ভাষা নয় । এটি উত্সাহজনকভাবে আপনাকে সিস্টেমের বিধিগুলি ভঙ্গ করতে দেয়। আপনি যদি এমন কোনও কক্ষে অবৈধ ও বোকামির মতো কিছু করার চেষ্টা করেন যা আপনার কাছে থাকার অনুমতি নেই এবং এমন কোনও ডেস্কের মাধ্যমে গুজব ছড়িয়ে দিতে পারে যা সম্ভবত সেখানে নাও থাকে, সি ++ আপনাকে থামবে না। সি ++ এর চেয়ে নিরাপদ ভাষাগুলি আপনার বিদ্যুৎকে সীমাবদ্ধ করে এই সমস্যাটি সমাধান করে - উদাহরণস্বরূপ কীগুলির উপর অনেক বেশি কঠোর নিয়ন্ত্রণ রেখে।
হালনাগাদ
পবিত্র সদা, এই উত্তরটি অনেক মনোযোগ পাচ্ছে। (কেন আমি নিশ্চিত নই - আমি এটিকে কেবল "মজাদার" সামান্য উপমা হিসাবে বিবেচনা করেছি, তবে যাই হোক না কেন)
আমি ভেবেছিলাম আরও কিছু প্রযুক্তিগত চিন্তাভাবনা নিয়ে এটি কিছুটা আপডেট করা জার্মানি হতে পারে।
সংকলকগণ কোড তৈরির ব্যবসায়ের সাথে থাকে যা সেই প্রোগ্রাম দ্বারা চালিত ডেটা সঞ্চয় করার ব্যবস্থা করে। মেমরি পরিচালনা করার জন্য কোড উত্পন্ন করার বিভিন্ন উপায় রয়েছে তবে সময়ের সাথে সাথে দুটি মূল কৌশল আবদ্ধ হয়ে গেছে।
প্রথমটি কোনও ধরণের "দীর্ঘজীবী" স্টোরেজ অঞ্চল রয়েছে যেখানে স্টোরেজটিতে প্রতিটি বাইটের "আজীবন" - যে সময়কালের সাথে এটি বৈধভাবে কোনও প্রোগ্রামের পরিবর্তনশীলের সাথে যুক্ত হয় - সময়টি সহজেই পূর্বাভাস করা যায় না সময়ের। সংকলকটি একটি "হিপ ম্যানেজার" এর মধ্যে কল উত্পন্ন করে যা জরুরীভাবে যখন প্রয়োজন হয় তখন স্টোরেজ কীভাবে বরাদ্দ করতে হয় এবং যখন প্রয়োজন হয় না তখন এটি পুনরায় দাবি করতে পারে।
দ্বিতীয় পদ্ধতিটি হ'ল "স্বল্পস্থায়ী" স্টোরেজ অঞ্চল যেখানে প্রতিটি বাইটের জীবনকাল সুপরিচিত। এখানে, জীবনকালগুলি একটি "বাসা বাঁধার" প্যাটার্ন অনুসরণ করে। এই স্বল্প-স্থায়ী ভেরিয়েবলগুলির মধ্যে সবচেয়ে দীর্ঘস্থায়ী কোনও অন্য স্বল্প-স্থায়ী ভেরিয়েবলের আগে বরাদ্দ দেওয়া হবে এবং শেষ অবধি মুক্তি পাবে। স্বল্প-জীবিত ভেরিয়েবলগুলি দীর্ঘকাল বেঁচে থাকার পরে বরাদ্দ করা হবে এবং তাদের আগে মুক্তি দেওয়া হবে। এই স্বল্প-জীবিত ভেরিয়েবলগুলির জীবনকাল দীর্ঘায়ু জীবনকালগুলির মধ্যে "নেস্টেড" থাকে।
স্থানীয় পরিবর্তনগুলি পরের প্যাটার্ন অনুসরণ করে; যখন কোনও পদ্ধতি প্রবেশ করা হয়, এর স্থানীয় ভেরিয়েবলগুলি জীবিত হয়। যখন সেই পদ্ধতিটি অন্য পদ্ধতিটিকে কল করে, তখন নতুন পদ্ধতির স্থানীয় ভেরিয়েবলগুলি জীবিত হয়। প্রথম পদ্ধতির স্থানীয় ভেরিয়েবলগুলি মারা যাওয়ার আগে এগুলি মারা যাবে। স্থানীয় ভেরিয়েবলগুলির সাথে সম্পর্কিত স্টোরেজগুলির জীবনকাল শুরু এবং শেষের আপেক্ষিক ক্রমটি আগেই কাজ করা যেতে পারে।
এই কারণেই, স্থানীয় ভেরিয়েবলগুলি সাধারণত "স্ট্যাক" ডেটা স্ট্রাকচারের স্টোরেজ হিসাবে উত্পন্ন হয়, কারণ একটি স্ট্যাকের এমন সম্পত্তি থাকে যা প্রথমে ধাক্কা দিয়ে শেষ জিনিসটি পপ-আপ হয়ে যায়।
এটির মতো হোটেলটি কেবলমাত্র ক্রমানুসারে কক্ষগুলি ভাড়া নেওয়ার সিদ্ধান্ত নিয়েছে এবং আপনি যতক্ষণ না চেক আউট করেছেন তার চেয়ে বেশি কক্ষের নম্বরযুক্ত প্রত্যেকটি আপনি পরীক্ষা করতে পারবেন না।
সুতরাং স্ট্যাক সম্পর্কে চিন্তা করা যাক। অনেক অপারেটিং সিস্টেমে আপনি প্রতি থ্রেডে একটি স্ট্যাক পান এবং স্ট্যাকটি নির্দিষ্ট নির্দিষ্ট আকার হিসাবে বরাদ্দ করা হয়। আপনি যখন কোনও পদ্ধতিতে কল করবেন তখন স্ট্যাকগুলিকে স্ট্যাকের উপর চাপ দেওয়া হবে। তারপরে যদি আপনি আপনার পদ্ধতিটি ব্যতীত স্ট্যাকের দিকে কোনও পয়েন্টারটি পাস করেন তবে মূল পোস্টারটি এখানে যেমন করে থাকে, এটি কিছু সম্পূর্ণ বৈধ মিলিয়ন-বাইট মেমরি ব্লকের মাঝখানে কেবল পয়েন্টার। আমাদের উপমা অনুসারে, আপনি হোটেলটি পরীক্ষা করে দেখুন; যখন আপনি এটি করেন, আপনি সর্বাধিক সংখ্যাযুক্ত দখলকৃত ঘরটি সন্ধান করে। যদি আপনার পরে আর কেউ চেক ইন না করে এবং আপনি অবৈধভাবে আপনার ঘরে ফিরে যান তবে আপনার সমস্ত জিনিস এখনও এই বিশেষ হোটেলটিতে থাকার গ্যারান্টিযুক্ত ।
আমরা অস্থায়ী স্টোরগুলির জন্য স্ট্যাকগুলি ব্যবহার করি কারণ সেগুলি সত্যই সস্তা এবং সহজ। স্থানীয়দের সংরক্ষণের জন্য স্ট্যাক ব্যবহার করার জন্য সি ++ প্রয়োগের প্রয়োজন হয় না; এটি গাদা ব্যবহার করতে পারে। এটি হয় না, কারণ এটি প্রোগ্রামটিকে ধীর করে দেবে।
সি ++ এর প্রয়োগের জন্য আপনি স্ট্যাকের যে আবর্জনা ফেলেছেন তা কোনও ধরণের ছাড়েনি যাতে আপনি পরে অবৈধভাবে এর জন্য ফিরে আসতে পারেন; সংকলকটির কোড তৈরি করা পুরোপুরি আইনী যা আপনি "খালি" শূন্যে যা কিছু সবে ফেলেছেন তা শূন্যে ফিরে আসে। এটি আবার কারণ নয়, এটি ব্যয়বহুল হবে।
সি ++ এর বাস্তবায়নের বিষয়টি নিশ্চিত করার প্রয়োজন হয় না যে স্ট্যাকটি যখন যৌক্তিকভাবে সঙ্কুচিত হয় তখন যেগুলি বৈধ হিসাবে ব্যবহৃত হয় সেগুলি এখনও মেমরিতে ম্যাপ করা হয়। প্রয়োগটি অপারেটিং সিস্টেমকে বলতে অনুমতি দেয় "আমরা এখন স্ট্যাকের এই পৃষ্ঠাটি ব্যবহার করেই সম্পন্ন করেছি I আমি অন্যথায় না বলা পর্যন্ত একটি ব্যতিক্রম ইস্যু করে যা কেউ পূর্ব-বৈধ স্ট্যাক পৃষ্ঠায় স্পর্শ করলে প্রক্রিয়াটিকে ধ্বংস করে দেয়"। আবার বাস্তবায়নগুলি আসলে এটি করে না কারণ এটি ধীর এবং অপ্রয়োজনীয়।
পরিবর্তে, বাস্তবায়ন আপনাকে ভুল করতে এবং এটি থেকে দূরে সরে যেতে দেয়। অধিকাংশ সময়. একদিন অবধি সত্যিই ভয়াবহ কিছু ভুল হয়ে যায় এবং প্রক্রিয়াটি বিস্ফোরিত হয়।
এটি সমস্যাযুক্ত। এখানে অনেকগুলি বিধি রয়েছে এবং এগুলি দুর্ঘটনাক্রমে ভাঙ্গা খুব সহজ। আমি অবশ্যই অনেক সময় আছে। সবচেয়ে বড় সমস্যাটি কেবল তখনই দেখা দেয় যখন দুর্নীতি হওয়ার পরে স্মৃতিশক্তি কোটি কোটি ন্যানো সেকেন্ড দুর্নীতিগ্রস্থ বলে ধরা পড়ে, কখন কে এটিকে গোলমাল করেছে তা নির্ধারণ করা খুব কঠিন।
আরও মেমরি-নিরাপদ ভাষা আপনার শক্তি সীমাবদ্ধ করে এই সমস্যাটি সমাধান করে। "সাধারণ" সি # তে কোনও লোকের ঠিকানা নেওয়া এবং এটি ফেরত দেওয়া বা পরে সঞ্চয় করার কোনও উপায় নেই। আপনি কোনও স্থানীয়ের ঠিকানা নিতে পারেন, তবে ভাষাটি চতুরতার সাথে তৈরি করা হয়েছে যাতে স্থানীয় জীবনকাল শেষ হওয়ার পরে এটি ব্যবহার করা অসম্ভব। অর্ডার একটি স্থানীয় ঠিকানা গ্রহণ করা এবং তা ফিরে পাস করার জন্য, আপনি "অনিরাপদ" মোড একটি বিশেষ মধ্যে কম্পাইলার করা আছে এবং শব্দ "অনিরাপদ" আসলে থেকে কল নজরে, আপনার প্রোগ্রাম রাখা যে আপনি সম্ভবত করছেন নিয়ম ভাঙতে পারে এমন বিপজ্জনক কিছু।
আরও পড়ার জন্য:
address of local variable ‘a’ returned
;Invalid write of size 4 [...] Address 0xbefd7114 is just below the stack ptr