RAII ใน C++
RAII (Resource Acquisition Is Initialization) เป็นเทคนิค C++ ที่ควบคุมวงจรชีวิตของทรัพยากร (resource) เป็นรูปแบบของคลาสและผูกมัดกับอายุของออบเจ็กต์
มันห่อหุ้มทรัพยากรหลายอย่างไว้ในคลาส โดยการจัดสรรทรัพยากรทำโดย constructor ระหว่างสร้างออบเจ็กต์ และการปล่อยทรัพยากรทำโดย destructor ระหว่างทำลายออบเจ็กต์
ทรัพยากรรับประกันว่าจะถูกครองจนกว่าออบเจ็กต์จะสิ้นสุดชีวิต
ตัวอย่าง
void file_write {
static mutex m; // mutex ป้องกันการเข้าถึงไฟล์
lock_guard<mutex> lock(m); // ล็อก mutex ก่อนเข้าถึงไฟล์
ofstream file("a.txt");
if (!file.is_open()) // ถ้าไฟล์เปิดไม่ได้
throw runtime_error("unable to open file");
// เขียนข้อความลงไฟล์
file << text << std::endl;
}
Smart Pointers ใน C++
Smart pointer เป็นชนิดข้อมูลนามธรรม (abstract data type) ที่ทำให้ pointer ธรรมดาสามารถจัดการหน่วยความจำได้อัตโนมัติ เช่น จัดการไฟล์, network sockets และอื่นๆ ยังทำ reference counting ได้อีกด้วย
Smart pointer ใน C++ สามารถ implement เป็น template class ที่ overload operator * และ -> ได้ auto_ptr, shared_ptr, unique_ptr และ weak_ptr เป็นรูปแบบของ smart pointer ที่ไลบรารี C++ รองรับ
ตัวอย่าง
#include <iostream>
using namespace std;
// คลาส smart pointer แบบ generic
template <class T>
class Smartpointer {
T *p; // pointer จริง
public:
// Constructor
Smartpointer(T *ptr = NULL) {
p = ptr;
}
// Destructor
~Smartpointer() {
delete(p);
}
// Overload dereference operator
T& operator * () {
return *p;
}
// Overload arrow operator เพื่อเข้าถึงสมาชิกของ T เหมือน pointer
T* operator -> () {
return p;
}
};
int main() {
Smartpointer<int> p(new int());
*p = 26;
cout << "Value is: " << *p;
return 0;
}
ผลลัพธ์
Value is: 26