দুজনের মধ্যে একটি গুরুত্বপূর্ণ পার্থক্য রয়েছে।
সবকিছু বরাদ্দ না new
অনেক C # এর মান ধরনের মত আচরণ (এবং মানুষ প্রায়ই বলবো যে, এসব বস্তু স্ট্যাক, যা সম্ভবত সবচেয়ে সাধারণ / সুস্পষ্ট ক্ষেত্রে দেখা যায় বরাদ্দ করা হয়, তবে সব সময় নয় সত্য। আরো অবিকল, বস্তু বরাদ্দ ব্যবহার না করেই new
আছে স্বয়ংক্রিয় স্টোরেজ সময়সীমার
সাথে বরাদ্দকৃত সমস্ত new
কিছুই গাদাতে বরাদ্দ করা হয়, এবং এর পয়েন্টারটি ফিরে আসে, ঠিক সি # তে রেফারেন্সের ধরণের মতো।
স্ট্যাকের জন্য বরাদ্দকৃত যেকোন কিছুতে একটি ধ্রুব আকার থাকতে হবে, সংকলন সময়ে নির্ধারিত (সংকলকটিকে স্ট্যাক পয়েন্টারটি সঠিকভাবে সেট করতে হবে, বা যদি বস্তু অন্য শ্রেণীর সদস্য হয়, তবে এটি অন্য শ্রেণীর আকার সামঞ্জস্য করতে হবে) । এজন্য সি # তে অ্যারেগুলি রেফারেন্স ধরণের। সেগুলি হতে হবে, কারণ রেফারেন্সের ধরণের সাথে আমরা রানটাইমে সিদ্ধান্ত নিতে পারি যে কত মেমরি চাইবে। এবং একই এখানে প্রযোজ্য। কেবল ধ্রুব আকারের অ্যারেগুলি (একটি আকার যা সংকলন সময়ে নির্ধারণ করা যায়) স্বয়ংক্রিয় স্টোরেজ সময়কাল (স্ট্যাকের) দিয়ে বরাদ্দ করা যেতে পারে। গতিবেগের আকারের অ্যারেগুলি কল করে, গাদাতে বরাদ্দ করতে হবে new
।
(এবং সেখানে সি # এর সাথে কোনও মিল রয়েছে)
এখন, স্ট্যাকের জন্য বরাদ্দকৃত কোনও কিছুর "স্বয়ংক্রিয়" স্টোরেজ সময়কাল রয়েছে (আপনি আসলে কোনও ভেরিয়েবল হিসাবে ঘোষণা করতে পারেন auto
, তবে অন্য কোনও স্টোরেজ প্রকার নির্দিষ্ট না করা থাকলে কীওয়ার্ডটি বাস্তবে ব্যবহার করা হয়নি, তবে এটি এটিই এখানে থেকে আসে)
স্বয়ংক্রিয় স্টোরেজ সময়কালের অর্থ হ'ল ঠিক কী মনে হচ্ছে, ভেরিয়েবলের সময়কাল স্বয়ংক্রিয়ভাবে পরিচালনা করা হয়। বিপরীতে, গাদাতে বরাদ্দকৃত যেকোন কিছুই আপনাকে ম্যানুয়ালি মুছে ফেলতে হবে। এখানে একটি উদাহরণ:
void foo() {
bar b;
bar* b2 = new bar();
}
এই ফাংশনটি বিবেচনার জন্য তিনটি মান তৈরি করে:
লাইন 1 এ, এটি স্ট্যাকের ( b
ধরণের bar
স্বয়ংক্রিয় সময়কাল) ধরণের পরিবর্তনশীল ঘোষণা করে ।
লাইন 2 এ, এটি স্ট্যাকের একটি bar
পয়েন্টার ঘোষণা করে b2
(স্বয়ংক্রিয় সময়কাল), এবং নতুনকে কল bar
করে, স্তূপে একটি অবজেক্ট বরাদ্দ করে। (গতিশীল সময়কাল)
যখন ফাংশনটি ফিরে আসবে, নিম্নলিখিতটি ঘটবে: প্রথমে, b2
সুযোগের বাইরে চলে যায় (ধ্বংসের ক্রমটি সর্বদা নির্মাণের ক্রমের বিপরীতে থাকে)। তবে b2
এটি কেবল একটি পয়েন্টার, তাই কিছুই হয় না, এটি যে স্মৃতি ধারণ করে তা কেবল মুক্তি দেওয়া হয়। এবং গুরুত্বপূর্ণ বিষয়, এটি যে স্মৃতিটি ইঙ্গিত করে ( bar
গাদা উপরের উদাহরণটি) তা স্পর্শ করে না। কেবলমাত্র পয়েন্টারটি মুক্ত হয়, কারণ কেবলমাত্র পয়েন্টারের স্বয়ংক্রিয় সময়কাল ছিল। দ্বিতীয়ত, b
সুযোগের বাইরে চলে যায়, সুতরাং এটির স্বয়ংক্রিয় সময়কাল হওয়ায় এর ডেস্ট্রাক্টরকে ডাকা হয় এবং স্মৃতি মুক্ত হয়।
এবং bar
গাদা নেভিগেশন উদাহরণ? এটা সম্ভবত এখনও আছে। কেউ এটিকে মুছতে বিরক্ত করেননি, তাই আমরা স্মৃতি ফাঁস করেছি।
এই উদাহরণ থেকে আমরা দেখতে পাচ্ছি যে স্বয়ংক্রিয় সময়কাল সহ যেকোনো কিছুই এর সুযোগসীমার বাইরে গেলে তার ডেস্ট্রাক্টরকে ডেকে আনার নিশ্চয়তা দেয় । এটি দরকারী। তবে স্তূপে বরাদ্দকৃত যে কোনও কিছু আমাদের যতক্ষণ প্রয়োজন ততক্ষণ স্থায়ী হয় এবং অ্যারের ক্ষেত্রে যেমন গতিশীল আকারের হতে পারে। এটিও কার্যকর। আমরা আমাদের মেমরির বরাদ্দগুলি পরিচালনা করতে এটি ব্যবহার করতে পারি। যদি ফু শ্রেণি তার নির্মাণকারীর স্তূপে কিছু মেমরি বরাদ্দ করে এবং সেই স্মৃতিটিকে তার ডেস্ট্রাক্টরে মুছে দেয়। তারপরে আমরা উভয় বিশ্বের সেরা, নিরাপদ মেমরির বরাদ্দ যা আবার মুক্ত হওয়ার গ্যারান্টিযুক্ত পেতে পারি, তবে সবকিছুকে স্ট্যাকের উপর চাপিয়ে দেওয়ার সীমাবদ্ধতা ছাড়াই।
এবং এটি বেশিরভাগ সি ++ কোড কীভাবে কাজ করে ঠিক তা ঠিক। std::vector
উদাহরণস্বরূপ স্ট্যান্ডার্ড লাইব্রেরির দিকে তাকান । এটি সাধারণত স্ট্যাকের জন্য বরাদ্দ করা হয়, তবে গতিশীল আকার এবং আকার পরিবর্তন করা যেতে পারে। এবং এটি অভ্যন্তরীণভাবে প্রয়োজনীয়ভাবে গাদাতে মেমরি বরাদ্দ করে এটি করে। শ্রেণীর ব্যবহারকারী এটি কখনই দেখে না, সুতরাং মেমরি ফাঁস হওয়ার বা আপনার বরাদ্দকৃত জিনিসগুলি পরিষ্কার করতে ভুলে যাওয়ার কোনও সম্ভাবনা নেই।
এই নীতিটিকে আরআইআইআই বলা হয় (রিসোর্স অ্যাকুইজিশন ইনিশিয়ালাইজেশন), এবং এটি যে কোনও সংস্থানেই অধিগ্রহণ ও প্রকাশ করতে হবে তা বাড়ানো যেতে পারে। (নেটওয়ার্ক সকেট, ফাইল, ডাটাবেস সংযোগ, সিঙ্ক্রোনাইজেশন লক)। এগুলির সমস্তগুলি নির্মাত্রে অর্জিত হতে পারে এবং ডেস্ট্রাক্টরে প্রকাশ করা যায়, সুতরাং আপনি নিশ্চয়তা দিয়েছেন যে আপনি যে সমস্ত সংস্থান অর্জন করেছেন তা আবার মুক্তি পাবে।
একটি সাধারণ নিয়ম হিসাবে, আপনার উচ্চ স্তরের কোড থেকে সরাসরি নতুন / মুছুন কখনই ব্যবহার করবেন না। সর্বদা এটিকে এমন একটি ক্লাসে মুড়ে দিন যা আপনার জন্য স্মৃতি পরিচালনা করতে পারে এবং যা নিশ্চিত করে যে এটি আবার মুক্তি পেয়েছে। (হ্যাঁ, এই নিয়মের ব্যতিক্রম হতে পারে। বিশেষ করে, স্মার্ট পয়েন্টার কল করার প্রয়োজন new
সরাসরি, এবং তার কন্সট্রাকটর, যা উপর এবং নিশ্চিত লাগে পয়েন্টার পাস delete
সঠিকভাবে বলা হয়। কিন্তু এই এখনও একটি চলতি খুবই গুরুত্বপূর্ণ নিয়ম )