Nghiên cứu Thành ngữ RAII (Mua tài nguyên là khởi tạo)! Xem ví dụ số Wikipedia article on RAII.
RAII chỉ là ý tưởng chung. Nó được sử dụng ví dụ: trong các lớp mẫuhoặc std::shared_ptr
của thư viện chuẩn C++.
giải thích Rất ngắn gọn về các thành ngữ RAII:
Về cơ bản, nó là ++ phiên bản C của try..finally
khối được tìm thấy trong một số ngôn ngữ khác. Thành ngữ RAII được cho là linh hoạt hơn.
Nó hoạt động như thế này:
Bạn viết một lớp bao bọc xung quanh tài nguyên của bạn (ví dụ bộ nhớ). Trình hủy có trách nhiệm giải phóng tài nguyên.
Bạn tạo, dưới dạng biến cục bộ (tự động), một thể hiện của lớp trình bao bọc trong phạm vi. Sau khi thực hiện chương trình rời khỏi phạm vi đó, hàm hủy của đối tượng sẽ được gọi, do đó giải phóng tài nguyên (ví dụ: bộ nhớ).
Điều quan trọng là rằng nó không quan trọng như thế nào phạm vi được kết thúc. Ngay cả khi một ngoại lệ được ném, phạm vi vẫn còn thoát và destructor của đối tượng bao bọc vẫn được gọi.
dụ Rất thô:
// BEWARE: this is NOT a good implementation at all, but is supposed to
// give you a general idea of how RAII is supposed to work:
template <typename T>
class wrapper_around
{
public:
wrapper_around(T value)
: _value(value)
{ }
T operator *()
{
return _value;
}
virtual ~wrapper_around()
{
delete _value; // <-- NOTE: this is incorrect in this particular case;
// if T is an array type, delete[] ought to be used
}
private:
T _value;
};
// ...
{
wrapper_around<char*> heap(new char[50]);
// ... do something ...
// no matter how the { } scope in which heap is defined is exited,
// if heap has a destructor, it will get called when the scope is left.
// Therefore, delegate the responsibility of managing your allocated
// memory to the `wrapper_around` template class.
// there are already existing implementations that are much better
// than the above, e.g. `std::unique_ptr` and `std::shared_ptr`!
}
Tại sao sử dụng mới, khi bạn có thể sử dụng con trỏ thông minh và RAII-friendly containers? –
@Pavel - Con trỏ thông minh và RAII vẫn có vấn đề về sử dụng phức tạp, đáng chú ý nhất xung quanh chu kỳ gây rò rỉ bộ nhớ và hành vi lạ khi truyền con trỏ xung quanh (đó là lý do tại sao auto_ptr không được sử dụng nhiều). Nếu bạn có một cái gì đó có sáng tạo rõ ràng và xóa điểm và bạn muốn nó có thể được sử dụng trong bất kỳ cách nào ở giữa thì không có gì sai với con trỏ thô. – tloach
Tôi không đồng ý về mặt phân loại. C++ đủ mạnh để thiết kế các trừu tượng rõ ràng thành các lớp rõ ràng với hành vi ngoại lệ thân thiện được chôn bên trong, thay vì phơi bày nó với người dùng. –