đóng gói mỗi tài nguyên trong một lớp học mà xóa chúng trong destructor của nó (với một thử xung quanh/catch):
struct ProperlyManagedA {
// some means of using the resource - a rudimentary way is this:
A &getA() { return a; }
const A &getA() const { return a; }
// cleanup
~ProperlyManagedA() {
try {
a.clear(); // whatever it is ClearResourceA actually does
} catch (...) {}
}
private:
A a;
}
Một shared_ptr
với một tuỳ chỉnh deleter là một cách để đạt được điều này mà không cần phải tạo toàn bộ lớp cho từng loại tài nguyên.
Bạn có thể cải thiện việc loại bỏ ngoại lệ (ví dụ: ghi nhật ký sự cố), tùy thuộc vào nội dung được ném.
Thậm chí tốt hơn, sửa đổi tài nguyên A, B và C để chúng tự rõ ràng trong các trình phá hủy của riêng chúng. Điều đó có thể là không thể, mặc dù.
Dù bằng cách nào, bạn có thể đặt nhiều tài nguyên như vậy vào một lớp đơn tùy ý, mà không thêm bất kỳ mã nào vào trình phá hủy của lớp. Đây là "khả năng mở rộng". Toàn bộ quan điểm của RAII, là mỗi người dùng của một tài nguyên không cần phải viết mã dọn dẹp để sử dụng tài nguyên một cách chính xác.
Nguồn
2010-10-14 14:52:34
Đó là * chắc chắn * không thể mở rộng. Cố gắng quản lý chỉ ba tài nguyên, bạn đã có lỗi logic. – nobar