ডাইনামিক মেমোরি ম্যানেজমেন্ট সিপ্লাসপ্লাস

আমরা যখন কোনো ভ্যারিয়েবল ডিক্লেয়ার করি, int a অথবা char user[100] সিপ্লাসপ্লাস তা মেমোরিতে নিজ থেকে এলোকেইট(বা সেট) এবং ডিলিট করে থাকে, তখন একটি নির্দিষ্ট সাইজও বলে দেয়া হয়(যেমনঃ অ্যারে), কিন্তু অনেক সময় আমরা সাইজ সরাসরি বলে দিতে পারি না, তখন আমাদেরকে ডাইনামিক মেমোরি এলোকেশন ব্যবহার করার প্রয়োজন পড়ে। লিংকড লিস্ট, ট্রি জাতীয় প্রবলেম সমাধানের জন্য ডাইনামিক মেমোরি খুব কাজে দিয়ে থাকে।

মেমোরি বিন্যাস(Memory Layout)

যখন কোনো প্রোগ্রাম এক্সিকিউট করা হয়, কম্পাইলার তখন একটি মেমোরি বিন্যাস(Memory Layout) তৈরি করে। সি অথবা সিপ্লাসপ্লাসের ক্ষেত্রে‌ এরকম Memory Layout তৈরি হয়,

আমরা এখন Stack ও Heap নিয়ে আলোচনা করব।

তবে আমাদেরকে প্রথমে পয়েন্টার বুঝতে হবে। পয়েন্টার মানে হল কোনো কিছু দিয়ে কোনো কিছুকে পয়েন্ট করা। সিপ্লাসপ্লাসে আমরা পয়েন্টার ব্যবহার করব কারণ আমাদেরকে stack এ থাকা কোনো ভ্যারিয়েবল Heap মেমোরিতে কার সাথে সংযুক্ত আছে সেটা বের করার জন্য। সাধারণত আমরা * সিন্ট্যাক্স ব্যবহার করি।

ডাইনামিক কিছু ডিক্লেয়ার করতে গেলে আমাদের new কিওয়ার্ড ব্যবহার করতে হয়। যখন new কিওয়ার্ড ব্যবহার করব Heap মেমোরিতে সাথে সাথে স্পেস তৈরি হয়ে যাবে,

int* p = new int

int* p দ্বারা একটি পয়েন্টার তৈরি হচ্ছে,

new int দ্বারা একটি Heap এ একটি স্থান বা অঞ্চল তৈরি হচ্ছে(সবুজ রঙ) ,

int* p = new int দ্বারা p কে Heap মেমোরির সাথে রেফারেন্স করা হচ্ছে

উপরের ছবিতে আমরা Heap এ 200 নং এড্রেস বুঝার জন্য ধরে নিয়েছি। p->200 Stack থেকে Heap এ সংযোগ হচ্ছে কিংবা রেফারেন্স তৈরি করছে।

এখন Heap এর 200 নং এড্রেসে কোনো ভ্যালু নাই, আমরা চাইলে এড করে দিতে পারি, *p = 10

#include<iostream>
using namespace std;

int main() {
    int* p = new int;
    *p = 10;
    cout<<*p; // 10
    return 0;
}

এখন Heap এর 200 এড্রেসের মান 10। যা আমরা দেখতে পারব cout<<*p; ব্যবহার করলে। আমরা এখন যদি চাই p কে নতুন করে মেমোরির নতুন অঞ্চলে এসাইন করব এবং তাতে নতুন ভ্যালুও সেট করে দিব,

p = new int;
*p = 20;

p এর রেফারেন্স 200 নং থেকে রিপ্লেস করে 300 নং এড্রেস কি’তে চলে আসল। এখন *p প্রিন্ট করলে আসবে 20।

লক্ষ্য করলে দেখা যাবে মেমোরিতে এক্সট্রা 200 নং এড্রেস কি (KEY) রয়ে গেছে, যার কোন কাজ নাই। যা থাকার কারণে Memory Leak তৈরি হতে পারে যা সিস্টেমের জন্য অনেক খারাপ কখনো কখনো সিস্টেম ক্রাশ করতে পারে,

সিপ্লাসপ্লাস এই অব্যবহৃত অঞ্চলকে মেমোরি থেকে বাদ দিতে delete কিওয়ার্ড ব্যবহার করে।

সেজন্য আমরা পয়েন্টারের রেফারেন্স পরিবর্তন করার পূর্বেই delete ব্যবহার করব।

int* p = new int;
*p = 10;
delete p; // p তে রেফারেন্স করা এরিয়াটি মেমোরি থেকে ডিলিট করে দিবে
p = new int(20); // নতুন করে মেমোরির নতুন এরিয়া রেফারেন্সকে করা হচ্ছে যার ভ্যালু 20
cout<<*p; // 20

তাহলে এখন মেমোরিতে শুধু ১টি এরিয়াই থাকবে এবং Memory Leak হওয়ার সম্ভাবনা থাকবে না।

Leave a Reply

Your email address will not be published. Required fields are marked *