C++ তে RAII
RAII (রিসোর্স অ্যাকুইজিশন ইজ ইনিশিয়ালাইজেশন) হল C++ কৌশল যা সম্পদের জীবনচক্র নিয়ন্ত্রণ করে। এটি একটি শ্রেণীর বৈকল্পিক এবং অবজেক্ট লাইফ টাইমের সাথে আবদ্ধ।
এটি বেশ কয়েকটি সংস্থানকে শ্রেণীতে অন্তর্ভুক্ত করে যেখানে অবজেক্ট তৈরির সময় কনস্ট্রাক্টর দ্বারা রিসোর্স অ্যালোকেশন করা হয় এবং রিসোর্স ডিলোকেশন অবজেক্ট ডেস্ট্রাকশনের সময় ডেস্ট্রক্টর দ্বারা করা হয়।
বস্তুটি জীবিত না হওয়া পর্যন্ত সম্পদ ধরে রাখার নিশ্চয়তা রয়েছে।
উদাহরণ
void file_write {
Static mutex m; //mutex to protect file access
lock_guard<mutex> lock(m); //lock mutex before accessing file
ofstream file("a.txt");
if (!file.is_open()) //if file is not open
throw runtime_error("unable to open file");
// write text to file
file << text << stdendl;
} C++ এবং বিয়োগ;
এ স্মার্ট পয়েন্টারস্মার্ট পয়েন্টার হল একটি বিমূর্ত ডেটা টাইপ যা ব্যবহার করে আমরা এমনভাবে একটি সাধারণ পয়েন্টার তৈরি করতে পারি যাতে এটি ফাইল হ্যান্ডলিং, নেটওয়ার্ক সকেট ইত্যাদির মতো মেমরি ম্যানেজমেন্ট হিসাবে ব্যবহার করা যেতে পারে, এছাড়াও এটি স্বয়ংক্রিয় ধ্বংস, রেফারেন্স গণনা ইত্যাদির মতো অনেক কিছু করতে পারে।
C++ এ স্মার্ট পয়েন্টার, টেমপ্লেট ক্লাস হিসাবে প্রয়োগ করা যেতে পারে, যা * এবং -> অপারেটরের সাথে ওভারলোড করা হয়। auto_ptr, shared_ptr, unique_ptr এবং weak_ptr হল স্মার্ট পয়েন্টারের ফর্ম C++ লাইব্রেরি দ্বারা প্রয়োগ করা যেতে পারে।
উদাহরণ
#include <iostream>
using namespace std;
// A generic smart pointer class
template <class T>
class Smartpointer {
T *p; // Actual pointer
public:
// Constructor
Smartpointer(T *ptr = NULL) {
p = ptr;
}
// Destructor
~Smartpointer() {
delete(p);
}
// Overloading de-referencing operator
T & operator * () {
return *p;
}
// Over loading arrow operator so that members of T can be accessed
// like a pointer
T * operator -> () {
return p;
}
};
int main() {
Smartpointer<int> p(new int());
*p = 26;
cout << "Value is: "<<*p;
return 0;
} আউটপুট
Value is: 26