RAII в C ++ / CLI

Я привык к возможностям 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 #).]

7
задан Deduplicator 24 February 2015 в 15:37
поделиться