RAII và việc tự động giải phóng tài nguyên trong C++
Trong bài học này, bạn sẽ so sánh cách đóng file an toàn trong C với kỹ thuật RAII của C++, nơi tài nguyên được tự động giải phóng.
Giới thiệu
RAII (Resource Acquisition Is Initialization) là kỹ thuật gắn vòng đời của tài nguyên như file, vùng nhớ hay kết nối với vòng đời của một đối tượng. Khi đối tượng bị hủy, tài nguyên được giải phóng tự động ở mọi đường thoát khỏi khối lệnh, kể cả khi có ngoại lệ xảy ra.
Những điểm quan trọng
- Hiểu cách làm trong C trước khi học các công cụ trừu tượng của C++.
- Dùng RAII và ngữ nghĩa giá trị (value semantics) để thể hiện quyền sở hữu tài nguyên.
- Ưu tiên các công cụ an toàn kiểu của C++ thay vì macro và ép kiểu.
Code ví dụ bằng C và C++
#include <stdio.h>
int main(void) {
int result = 1;
FILE *file = fopen("scores.txt", "w");
if (!file) goto cleanup;
if (fputs("Ada 95\n", file) < 0) goto cleanup;
result = 0;
cleanup:
if (file) fclose(file);
puts(result ? "failed" : "saved");
return result;
}
saved
#include <fstream>
#include <iostream>
int main() {
std::ofstream file("scores.txt");
if (!file) return 1;
file << "Ada 95\n";
std::cout << "saved\n";
}
saved
So sánh C và C++
Trong C, chương trình dùng nhãn cleanup và lệnh goto để mọi trường hợp, dù thành công hay lỗi, đều đi qua bước fclose đóng file. Trong C++, std::ofstream tự đóng file trong hàm hủy (destructor) khi biến file ra khỏi phạm vi. Nhờ vậy, việc quản lý tài nguyên gọn gàng hơn và ít nguy cơ quên giải phóng.
C dùng quy ước đặt tên, callback, macro và struct chứa ngữ cảnh.
C++ có sẵn các công cụ trừu tượng có phạm vi rõ ràng, an toàn kiểu và thường không tốn thêm chi phí khi chạy.
Bài tập mở rộng
Hãy chạy cả hai phiên bản, sau đó thử thay đổi code để quan sát sự khác biệt về mức độ an toàn mà mỗi ngôn ngữ mang lại.
- Tự viết cơ chế bằng C trước, rồi mới dùng tính năng tương ứng của C++.
- Thay việc giải phóng tài nguyên thủ công bằng RAII.
- Kiểm tra xem tính năng có phát sinh cấp phát bộ nhớ hoặc lời gọi hàm ảo hay không.
Luyện tập với thử thách
Áp dụng kiến thức của bài học này để giải một bài toán thực tế. Mỗi thử thách chạy ngay trên trình duyệt, có kiểm thử tức thì và AI nhận xét.
Tất cả thử thách