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

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

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

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

     // Все, что следует далее, является управляемым кодом
    void WillThisLeak (недействительно)
    {
    Строка ^ str = gcnew Строка ^ ();
     // Я только что потерял память? Или GC уберет это? что, если возникнет исключение?
    }
    void NotGoingToLeak (недействительно)
    {
    Строка ^ str = gcnew Строка ^ ();
    удалить str;
     // Гарантированно не протекает, но нужно ли это?
    }
    void ТакжеNotGoingToLeak (недействительно)
    {
    auto_handle <Строка ^> str = gcnew String ^ ();
     // Также гарантировано отсутствие утечек, но нужно ли это?
    }
    void DidntEvenKnowICouldDoThisUntilToday (недействительно)
    {
    Строка str ();
     // Также гарантировано отсутствие утечек, но нужно ли это?
    }
    

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

  2. 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? Похоже, они делают похожие вещи.

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

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

14
задан Max Ehrlich 9 February 2012 в 21:17
поделиться