ما هو RAII (Resource Acquisition Is Initialization) في C++ ولماذا هو مطلوب؟
مرحبًا أيها الزملاء! أنا أتعلم C++ وأسمع باستمرار عن RAII، لكنني لا أستطيع فهم هذا المفهوم تمامًا. يبدو أن الاختصار يعني "الحصول على المورد هو التهيئة"، لكن هذا يبدو مربكًا بعض الشيء.
لدي مشكلة محددة. أنا أكتب فئة صغيرة للعمل مع الملفات. هذا هو الكود الخاص بي:
```cpp
class FileHandler {
public:
FileHandler(const char* filename) {
file = fopen(filename, "r");
if (!file) {
std::cerr << "فشل فتح الملف" << std::endl;
}
}
void readData() {
// نقرأ البيانات
char buffer[100];
fgets(buffer, 100, file);
}
~FileHandler() {
// هنا أنسى إغلاق الملف
}
private:
FILE* file;
};
```
المشكلة هي أنني غالبًا ما أنسى إغلاق الملف، وهذا يؤدي إلى تسرب الموارد. RAII يحل هذه المشكلة عن طريق ربط دورة حياة المورد بدورة حياة الكائن. عندما يتم إنشاء الكائن، يتم الحصول على المورد (فتح الملف). وعندما يتم تدمير الكائن (عند الخروج من النطاق)، يتم تحرير المورد تلقائيًا (إغلاق الملف) في destructor.