Je suis extrêmement confus en ce qui concerne la gestion des ressources en C++/CLI. Je pensais avoir la main (sans jeu de mots) sur le sujet, mais je suis tombé sur l'article suivant auto_gcroot<T>
J'ai donc fait une recherche sur Google, puis j'ai passé une bonne partie de la journée à lire la documentation, et maintenant je suis confus. J'ai donc décidé de me tourner vers la communauté.
Mes questions portent sur la différence entre la sémantique auto_handle/stack et auto_gcroot/gcroot.
-
auto_handle : Si j'ai bien compris, cela permet de nettoyer un objet géré créé dans une fonction gérée. Ma confusion vient du fait que le ramasse-miettes n'est pas censé le faire à notre place ? N'était-ce pas le but du code géré ? Pour être plus précis :
//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? }
Cela me paraîtrait logique s'il s'agissait d'un remplacement du mot-clé using en C#, et s'il n'était recommandé que pour les types gourmands en ressources comme Bitmap, mais cela n'est mentionné nulle part dans la documentation, et j'ai donc peur d'avoir des fuites de mémoire depuis tout ce temps.
-
auto_gcroot
Puis-je le passer comme argument à une fonction native ? Que se passera-t-il lors de la copie ?
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?
}
Cela aurait-il fonctionné si j'avais utilisé un gcroot à la place ?
De plus, quel est l'avantage d'avoir auto_handle et auto_gcroot ? Il semble qu'ils fassent des choses similaires.
Je dois avoir mal compris quelque chose pour que cela ait si peu de sens, une bonne explication serait donc la bienvenue. De même, tout conseil concernant l'utilisation correcte de ces types, les endroits où je peux aller pour apprendre ces choses, et toute autre bonne pratique/endroit où je peux les trouver serait grandement apprécié.
Merci beaucoup, Max