C ++ / CLI Resource Management Confusion

Estou extremamente confuso sobre gerenciamento de recursos em C ++ / CLI. Eu pensei que tinha uma alça (sem trocadilhos), mas me deparei com oauto_gcroot<T> class enquanto procurava nos arquivos de cabeçalho, o que levou a uma pesquisa no google, depois a maior parte do dia lendo a documentação e agora a confusão. Então imaginei que iria recorrer à comunidade.

Minhas perguntas dizem respeito à diferença entre a semântica auto_handle / stack e auto_gcroot / gcroo

auto_handle: Meu entendimento é que isso irá limpar um objeto gerenciado criado em uma função gerenciada. Minha confusão é que o coletor de lixo não deveria fazer isso por nós? Não era esse o objetivo do código gerenciado? Para ser mais específico:

//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? 
}

Agora, isso faria sentido para mim se fosse um substituto para o C # usando a palavra-chave, e só foi recomendado para uso com tipos de uso intensivo de recursos como o Bitmap, mas isso não é mencionado em nenhum lugar nos documentos, por isso, tenho medo de estar perdendo memória. o tempo todo agora

auto_gcroot

Posso passar isso como argumento para uma função nativa? O que acontecerá na cópia?

    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?
    }

Isso funcionaria se eu tivesse usado um gcroot?

Além disso, qual é a vantagem de ter auto_handle e auto_gcroot? Parece que eles fazem coisas semelhantes.

Devo estar entendendo mal algo para que isso faça tão pouco sentido; portanto, uma boa explicação seria ótima. Além disso, qualquer orientação sobre o uso adequado desses tipos, locais onde eu possa aprender essas coisas e outras boas práticas / locais que eu possa encontrar serão muito apreciadas.

muito obrigado, Max

questionAnswers(2)

yourAnswerToTheQuestion