Путаница управления ресурсами C ++ / CLI

Я очень запутался в управлении ресурсами в C ++ / CLI. Я думал, что у меня есть ручка (без каламбура), но я наткнулся черезauto_gcroot<T> класс, просматривая заголовочные файлы, которые привели к поиску в Google, затем лучшая часть дня, читая документацию, и теперь путаница. Так что я решил обратиться к сообществу.

Мои вопросы касаются разницы между семантикой auto_handle / stack и auto_gcroot / gcroot.

auto_handle: Насколько я понимаю, это приведет к очистке управляемого объекта, созданного в управляемой функции. Мое замешательство в том, что сборщик мусора не должен делать это для нас? Разве не в этом весь смысл управляемого кода? Чтобы быть более конкретным:

//Everything that follows is managed code
void WillThisLeak(void)
{
    String ^str = gcnew String ^();
    //Did I just leak memory? Or will GC clean this up? what if an exception is thrown?
}

void NotGoingToLeak(void)
{
    String ^str = gcnew String^();
    delete str;
    //Guaranteed not to leak, but is this necessary? 
}

void AlsoNotGoingToLeak(void)
{
    auto_handle<String ^> str = gcnew String^();
    //Also Guaranteed not to leak, but is this necessary? 
}

void DidntEvenKnowICouldDoThisUntilToday(void)
{
    String str();
    //Also Guaranteed not to leak, but is this necessary? 
}

Теперь это имело бы смысл для меня, если бы это было заменой ключевого слова C # using, и это было рекомендовано только для использования с ресурсоемкими типами, такими как Bitmap, но это не упоминается нигде в документации, так что, боюсь, у меня пропала память время сейчас

auto_gcroot

Могу ли я передать его в качестве аргумента нативной функции? Что будет на копии?

    void function(void)
    {
        auto_gcroot<Bitmap ^> bmp = //load bitmap from somewhere
        manipulateBmp(bmp);
        pictureBox.Image = bmp;  //Is my Bitmap now disposed of by auto_gcroot?
    }

    #pragma unmanaged

    void maipulateBmp(auto_gcroot<Bitmap ^> bmp)
    {
        //Do stuff to bmp
        //destructor for bmp is now called right? does this call dispose?
    }

Сработало бы это, если бы я использовал вместо этого gcroot?

Кроме того, в чем преимущество наличия auto_handle и auto_gcroot? Кажется, они делают подобные вещи.

Должно быть, я что-то неправильно понял, чтобы это так мало имело смысла, поэтому хорошее объяснение было бы здорово. Также будет очень благодарна за любые рекомендации относительно правильного использования этих типов, мест, куда я могу пойти, чтобы изучить этот материал, и любых других полезных практик / мест, которые я могу найти их.

большое спасибо Макс

Ответы на вопрос(1)

Ваш ответ на вопрос