Я привык к возможностям C ++ RAII и хочу правильно использовать RAII с управляемым кодом в C ++ / CLI. Херб Саттер и Microsoft оба говорят мне, что это лучшая практика.
У меня есть что-то вроде этого:
ref struct Managed
{
// No default constructor
Managed( /*...*/ ) { /*...*/ }
~Managed() { /* Important non-managed resource release here */ }
// ...
};
ref struct UsesManaged
{
Managed^ m_;
array^ a_;
UsesManaged( Managed^ m, array^ a ) : m_(m), a_(a) {}
// ...
};
ref struct Creator
{
Managed^ m_;
array^ 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( 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 #.)
из-за исключения).
В стандартном 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 #.)
из-за исключения).
В стандартном 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 #.)
Единственный актуальный интеллектуальный указатель C ++ / CLI, который я вижу, - это редко документированный msclr :: auto_handle , который похож на std :: auto_ptr, включая семантику передачи права собственности, которая несовместима с векторами, хотя они бы нормально работали в массиве.
Каким правильным способом C ++ / CLI можно достичь трех моих целей? (Обратите внимание, что мой основной класс C ++ / CLI, Creator в приведенном выше примере, будет использоваться VB / C #.)
Единственный актуальный интеллектуальный указатель C ++ / CLI, который я вижу, - это редко документированный msclr :: auto_handle , который похож на std :: auto_ptr, включая семантику передачи права собственности, которая несовместима с векторами, хотя они бы нормально работали в массиве.
Каким правильным способом C ++ / CLI можно достичь трех моих целей? (Обратите внимание, что мой основной класс C ++ / CLI, Creator в приведенном выше примере, будет использоваться VB / C #.)
[Обновления: добавлены ссылки на Herb Sutter и MS вверху и добавлена цель 3 (потребление VB / C #).]