Я привык к средствам RAII C ++ и хочу правильно использовать RAII с управляемым кодом в C ++ / CLI. Трава Саттер и Microsoft оба говорят мне, что это лучшая практика.
У меня есть что-то вроде этого:
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_ );
}
};
Я хочу (1) автоматическое уничтожение ресурсов, поэтому мне не нужно удалять каждый объект gcnew'ом вручную, особенно при исключениях;(2) способность делиться объектами безопасно и четко (передача std :: auto_ptr и тому подобное не подходит);и (3) возможность использования моего класса VB или C # и автоматического запуска очистки, когда объект выходит из области видимости (например, из-за исключения).
В стандартном C ++ я использовал быstd :: shared_ptr и std :: vector или аналогичные средства для автоматизации RAII.Здесь я мог бы использовать вектор STL / CLI, но нет эквивалента shared_ptr.Единственный релевантный интеллектуальный указатель C ++ / CLI, который я вижу, это редко документированный msclr :: auto_handle , который похож на std :: auto_ptr, включая семантику передачи права собственности, которая несовместима с векторамиони будут работать хорошо в массиве.
Как правильно использовать C ++ / CLI для достижения моих трех целей?(Также обратите внимание, что мой основной класс C ++ / CLI, Creator в приведенном выше, будет использован VB / C #.)
[Обновления: добавлены ссылки на Херба Саттера и MS вверху и добавлена цель 3 (потреблениепо VB / C #).]