0Pricing
C++ Academy · บทเรียน

หลักการ RAII

ผูกทรัพยากรเข้ากับอายุการใช้งานของออบเจกต์

หลักการ RAII เป็นบทเรียน C++ Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C++ Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน

RAII คืออะไร

RAII ย่อมาจาก การจัดหา Resource ระหว่างการเริ่มต้น โดยจะจัดหา Resource ในตัวสร้างและคืน Resource ในตัวทำลาย ทำให้อายุการใช้งานของ Resource ผูกอยู่กับออบเจ็กต์

แนวคิดหลัก

ห่อหุ้ม Resource ทุกชนิด ไม่ว่าจะเป็นหน่วยความจำ ไฟล์ ล็อก หรือซ็อกเก็ต ไว้ในออบเจ็กต์ เมื่อออบเจ็กต์ออกจากขอบเขต ตัวทำลายของออบเจ็กต์จะคืน Resource โดยอัตโนมัติ

#include <iostream>

class Resource {
public:
    Resource() { std::cout << "acquire\n"; }
    ~Resource() { std::cout << "release\n"; }
};

int main() {
    Resource r;   // acquired
}                 // released automatically

เหตุใด RAII จึงทรงพลัง

การล้างหน่วยความจำจะเกิดขึ้นอย่างแน่นอน แม้ฟังก์ชันจะคืนค่าก่อนกำหนดหรือมีการโยนข้อยกเว้น คุณจะไม่ลืมคืน Resource ที่ห่อหุ้มไว้อีกต่อไป

ตัวห่อหุ้ม RAII ขนาดเล็ก

นี่คือตัวจัดการชนิด int ที่คืนหน่วยความจำบนฮีปในตัวทำลาย จึงไม่ต้องเรียกใช้ delete ด้วยตนเอง ณ จุดเรียกใช้

#include <iostream>

class IntBox {
    int* p;
public:
    IntBox(int v) : p(new int(v)) {}
    ~IntBox() { delete p; }
    int get() const { return *p; }
};

int main() {
    IntBox b(42);
    std::cout << b.get() << "\n";
}

การล้างหน่วยความจำเมื่อคืนค่าก่อนกำหนด

เนื่องจากตัวทำลายทำงานเมื่อออกจากขอบเขต การใช้ return เพื่อคืนค่าก่อนกำหนดก็ยังทำให้เกิดการล้างหน่วยความจำ

#include <iostream>

class Guard {
public:
    ~Guard() { std::cout << "cleaned\n"; }
};

void work(bool stop) {
    Guard g;
    if (stop) return;   // g still cleaned
    std::cout << "more work\n";
}

int main() { work(true); }

การล้างหน่วยความจำเมื่อเกิดข้อยกเว้น

หากข้อยกเว้นคลายสแตก ออบเจ็กต์ RAII ที่สร้างเสร็จสมบูรณ์ทุกตัวจะถูกทำลายระหว่างทาง Resource จึงไม่ถูกทิ้งค้างไว้

ชนิดข้อมูล RAII มาตรฐาน

ไลบรารีมาตรฐานเต็มไปด้วย RAII เช่น std::unique_ptr, std::lock_guard, std::fstream และ std::vector ซึ่งล้างหน่วยความจำในตัวทำลายของตนเองทั้งหมด

#include <vector>
#include <memory>

int main() {
    std::vector<int> v{1, 2, 3};        // frees its buffer
    auto p = std::make_unique<int>(9);  // frees its int
}

ไม่ต้องเขียนโค้ดล้างหน่วยความจำเอง

เมื่อใช้ RAII คุณจะหยุดเขียน delete, fclose หรือ unlock ด้วยตนเอง การเรียกตัวทำลายที่คอมไพเลอร์แทรกให้จะจัดการเรื่องนี้แทนคุณ

ผู้ถือครองหนึ่งรายต่อ Resource

Resource แต่ละรายการควรมีผู้ถือครอง RAII เพียงรายเดียวซึ่งรับผิดชอบการคืน Resource การแบ่งปันสิทธิ์การถือครองอย่างปลอดภัยต้องใช้ชนิดข้อมูลเฉพาะ เช่น std::shared_ptr

RAII ประกอบกันได้

ออบเจ็กต์ RAII หนึ่งตัวสามารถบรรจุออบเจ็กต์ RAII อื่น ๆ ได้ การทำลายจะส่งต่อเป็นลำดับโดยอัตโนมัติ ทำให้ Resource ที่ซับซ้อนได้รับการล้างอย่างถูกต้อง

#include <memory>
#include <vector>

struct Session {
    std::vector<int> data;                 // RAII
    std::unique_ptr<int> token;            // RAII
};   // both members freed automatically

RAII เทียบกับการจัดการด้วยตนเอง

การจัดการด้วยตนเองมีโอกาสเกิดข้อผิดพลาดสูง ส่วน RAII ทำให้การล้างหน่วยความจำอย่างถูกต้องเป็นค่าเริ่มต้น โปรดเลือกใช้ตัวห่อหุ้ม RAII แทนคู่คำสั่งจัดหาและคืน Resource แบบดิบในทุกกรณี

ตรวจสอบความเข้าใจอย่างรวดเร็ว

โปรดทดสอบความเข้าใจเรื่อง RAII

สรุปทบทวน

คุณได้เรียนรู้หลักการ RAII ซึ่งคือการจัดหา Resource ในตัวสร้างและคืน Resource ในตัวทำลาย หลักการนี้รับประกันการล้างหน่วยความจำเมื่อออกจากโปรแกรมตามปกติ เมื่อคืนค่าก่อนกำหนด และเมื่อเกิดข้อยกเว้น ไลบรารีมาตรฐานใช้ RAII อยู่ทั่วไป และโค้ดของคุณก็ควรใช้เช่นกัน

คำถามที่พบบ่อย

บทเรียน “หลักการ RAII” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “หลักการ RAII” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C++ Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “หลักการ RAII”

ผูกทรัพยากรเข้ากับอายุการใช้งานของออบเจกต์ คุณปฏิบัติ C++ Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C++ Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน C++ Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน

บทเรียน “หลักการ RAII” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน C++ Academy นี้ได้ไหม

ได้ บทเรียน C++ Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. หลักการ RAII
  2. ตัวทำลายและการล้างทรัพยากร
  3. กฎสาม/ห้า
  4. การ์ดขอบเขต
← กลับไปที่ C++ Academy