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