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