কম্পিউটার টিউটোরিয়াল

C++-এ RAII এবং স্মার্ট পয়েন্টার (Smart Pointers)

C++-এ RAII

RAII (Resource Acquisition Is Initialization) হলো C++-এ একটি কৌশল যা রিসোর্সের লাইফসাইকেল নিয়ন্ত্রণ করে। এটি একটি ক্লাস ভেরিয়েন্ট এবং অবজেক্টের লাইফটাইমের সাথে আবদ্ধ।

এটি রিসোর্সগুলকে ক্লাসে এনক্যাপসুলেট করে যেখানে রিসোর্স অ্যালোকেশন অবজেক্ট তৈরি হওয়ার সময় কনস্ট্রাক্টর দ্বারা এবং রিসোর্ড ডি-অ্যালোকেশন অবজেক্ট ধ্বংস হওয়ার সময় ডেস্ট্রাক্টর দ্বারা হয়।

রিসোর্স অবজেক্ট জীবিত থাকার পর্যন্ত ধরায় থাকা гаран্টি করা হয়।

উদাহরণ কোড

void file_write {
    static mutex m; // ফাইল অ্যাক্সেস প্রোটেক্ট করতে মিউটেক্স
    lock_guard<mutex> lock(m); // ফাইল অ্যাক্সেস করার আগে মিউটেক্স লক
    ofstream file("a.txt");
    if (!file.is_open()) // ফাইল ওপেন না হলে
        throw runtime_error("unable to open file");
    // ফাইলে টেক্সট লেখা
    file << text << endl;
}

C++-এ স্মার্ট পয়েন্টার

স্মার্ট পয়েন্টার একটি অ্যাবসট্রাক্ট ডেটা টাইপ যার মাধ্যমে আমরা একটি সাধারণ পয়েন্টারকে এমনভাবে তৈরি করতে পারি যাতে সেটি মেমরি ম্যানেজমেন্টের মত ফাইল হ্যান্ডলিং, নেটওয়ার্ক সকেট ইত্যাদির জন্য ব্যবহার করা যায়, এছাড়া এটি অটোম্যাটিক ডিস্ট্রাকশন, রেফারেন্স কাউন্টিং ইত্যাদি কাজও করতে পারে।

C++-এ স্মার্ট পয়েন্টার টেমপ্লেট ক্লাস হিসেবে ইমপ্লিমেন্ট করা যায়, যা * এবং -> অপারেটর দিয়ে ওভারলোড করা থাকে। auto_ptr, shared_ptr, unique_ptr এবং weak_ptr হলো C++ লাইব্রেরি দ্বারা ইমপ্লিমেন্ট করা স্মার্ট পয়েন্টার এর রূপ।

উদাহরণ কোড

#include <iostream>
using namespace std;

// জেনেরিক স্মার্ট পয়েন্টার ক্লাস টেমপ্লেট
template <class T>
class Smartpointer {
    T *p; // আসলে পয়েন্টার
    public:
        // কনস্ট্রাক্টর
        Smartpointer(T *ptr = NULL) {
            p = ptr;
        }
        // ডেস্ট্রাক্টর
        ~Smartpointer() {
            delete(p);
        }
        // ডি-রেফারেন্সিং অপারেটর ওভারলোড
        T & operator * () {
            return *p;
        }
        // অ্যারো অপারেটর ওভারলোড যাতে T-এর মেম্বার পয়েন্টার মতো অ্যাক্সেস করা যায়
        T * operator -> () {
            return p;
        }
};

int main() {
    Smartpointer<int> p(new int());
    *p = 26;
    cout << "Value is: " << *p;
    return 0;
}

আউটপুট

Value is: 26
  1. সি++-এ n-তম স্মার্ট নম্বর (Smart Number) বের করা

  2. C# এবং C++-এর পার্থক্য: বিস্তারিত তুলনা

  3. C++-এ DNF অ্যালগরিদম দিয়ে ০, ১, ২ সর্ট করা

  4. C++-এ লিনাক্সে ফাইল গ্লোবিং (File Globbing)