หลักการ 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 automaticallyRAII เทียบกับการจัดการด้วยตนเอง
การจัดการด้วยตนเองมีโอกาสเกิดข้อผิดพลาดสูง ส่วน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- หลักการ RAII
- ตัวทำลายและการล้างทรัพยากร
- กฎสาม/ห้า
- การ์ดขอบเขต