RAII và cleanup xác định
RAII giúp cleanup tự động ở mọi đường thoát scope, kể cả exception.
RAII và cleanup xác định là gì?
RAII giúp cleanup tự động ở mọi đường thoát scope, kể cả exception.
Gắn lifetime tài nguyên với lifetime object.
Điểm quan trọng
- Hiểu cơ chế trong C trước khi học abstraction của C++.
- Dùng RAII và value semantics để diễn đạt ownership.
- Ưu tiên abstraction type-safe hơn macro và cast.
Code ví dụ bằng C và C++
main.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
C++
main.cpp
#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++
C dùng cleanup label để mọi path đều fclose; C++ fstream đóng trong destructor nên ownership cục bộ và ít leak hơn.
C
C dùng naming convention, callback, macro và context struct.
C++
Tính năng ngôn ngữ cung cấp abstraction có scope, type-safe và thường zero-overhead.
Bài tập mở rộng
Chạy cả hai phiên bản rồi thay đổi để quan sát khác biệt về bảo đảm của từng ngôn ngữ.
- Viết cơ chế bằng C trước abstraction C++.
- Loại bỏ manual cleanup bằng RAII.
- Kiểm tra allocation hoặc virtual dispatch phát sinh.