Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

RAII และ Smart Pointers ใน C++

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