Tôi đã quen với các cơ sở C++ RAII và tôi muốn sử dụng RAII đúng cách với mã được quản lý trong C++/CLI. HerbSutter và Microsoft cả hai đều cho tôi biết đây là phương pháp hay nhất.RAII trong C++/CLI
Tôi có một cái gì đó như thế này:
ref struct Managed
{
// No default constructor
Managed(/*...*/) { /*...*/ }
~Managed() { /* Important non-managed resource release here */ }
// ...
};
ref struct UsesManaged
{
Managed^ m_;
array<Managed^>^ a_;
UsesManaged(Managed^ m, array<Managed^>^ a) : m_(m), a_(a) {}
// ...
};
ref struct Creator
{
Managed^ m_;
array<Managed^>^ a_;
UsesManaged^ u_;
Creator()
{
// Must allocate dynamically here, not in initializer list
// because in my real code, I use "this" here for a callback.
m_ = gcnew Managed(/*...*/);
a_ = gcnew array<Managed^>(2);
a_[ 0 ] = gcnew Managed(/*...*/);
a_[ 1 ] = gcnew Managed(/*...*/);
u_ = gcnew UsesManaged(m_, a_);
}
};
Tôi muốn (1) phá hủy tài nguyên tự động vì vậy tôi không cần phải xóa tất cả các đối tượng gcnew'ed bằng tay, đặc biệt là khi đối mặt với trường hợp ngoại lệ; (2) khả năng chia sẻ các đối tượng một cách an toàn và rõ ràng (đi qua xung quanh std :: auto_ptr và những thứ tương tự không đủ điều kiện); và (3) khả năng để lớp của tôi được tiêu thụ bởi VB hoặc C# và việc dọn dẹp tự động chạy khi đối tượng nằm ngoài phạm vi (ví dụ, do một ngoại lệ).
Trong tiêu chuẩn C++ tôi muốn sử dụng tiêu chuẩn :: shared_ptr và std :: vector hoặc các cơ sở tương tự để tự động hóa RAII. Ở đây, tôi có thể sử dụng vector của STL/CLI, nhưng không có shared_ptr tương đương. Con trỏ thông minh C++/CLI liên quan duy nhất tôi thấy là sparsely documented msclr::auto_handle, tương tự như std :: auto_ptr, bao gồm cả ngữ nghĩa chuyển giao quyền sở hữu, không tương thích với vectơ, mặc dù chúng hoạt động ổn định trong một mảng.
Cách C++/CLI phù hợp để đạt được ba mục tiêu của tôi là gì? (Cũng lưu ý, lớp C++/CLI chính của tôi, Trình tạo ở trên, sẽ được tiêu thụ bởi VB/C#.)
[Cập nhật: Thêm liên kết vào Herb Sutter và MS ở trên cùng và thêm mục tiêu 3 (tiêu thụ bởi VB/C#)]
Nói đúng, đây không phải là RAII bởi vì bạn đang sử dụng bài tập, chứ không phải khởi tạo, để sở hữu tài nguyên. Nó là một con trỏ thông minh chia sẻ rất nhiều với RAII. –
Giao diện IDisposable là một mẫu được thiết lập tốt trong mã được quản lý. Nhưng bạn * thực sự * cũng phải bao gồm trình hoàn thiện để giải phóng tài nguyên được thực hiện tự động. Thêm! Được quản lý(). –
Hans, tôi nghĩ bạn có thể đã xóa câu trả lời dài hơn về điều này. Nó rất hữu ích, và tôi ước bạn đã rời khỏi nó để chúng tôi có thể thảo luận ở đó. – metal