C'est une vraie fuite. Les variables locales de thread ne sont pas finalisées lorsqu'elles sont hors de portée. Étant donné que votre enregistrement contient un champ géré, le champ chaîne, la mémoire allouée par tas associée à cette chaîne est divulguée si l'enregistrement n'est pas finalisé.
Les documentation appelle cette explicitement:
variables dynamiques qui sont habituellement gérées par le compilateur (longues chaînes, des chaînes larges, des tableaux dynamiques, des variantes, et interfaces) peuvent être déclarées avec threadvar, mais le compilateur ne libère pas automatiquement la mémoire allouée par tas créée par chaque thread d'exécution. Si vous utilisez ces types de données dans des variables de thread, il est de votre responsabilité de disposer de leur mémoire à partir du thread, avant que le thread se termine.
Si vous souhaitez colmater la fuite, vous devrez finaliser la variable à la fin de la portée. C'est-à-dire que le thread se termine.
Finalize(Context);
Notez que vous devez exécuter ce code du fil qui possède la variable puisque, de toute évidence, que ce fil a accès.
Si vous souhaitez supprimer le signalement de ces fuites, appelez RegisterExpectedMemoryLeak.
Si vous ne pouvez pas exécuter de code lorsque les threads se terminent, il peut être préférable d'éviter l'allocation de tas et d'utiliser un tableau de caractères de longueur fixe. Très probablement que vous répondez à vos besoins.
Il semblerait étrange que vous prétendez ne pas être en mesure d'exécuter du code lorsque les threads se terminent. Si vous ne pouvez pas faire cela, comment pouvez-vous exécuter du code dans le contexte de ces threads. En d'autres termes, pour qu'il y ait une fuite, vous devez avoir exécuté votre code dans ces threads.
Je crois que le fil doit nettoyer les valeurs dynamiques? Essayez d'ajouter Context.Value: = '' dans le code de nettoyage du thread. – whosrdaddy
Cela fait partie de mon code de journalisation, donc je ne peux pas contrôler le nettoyage des threads car cela peut être appelé à partir de n'importe quel thread. – jpfollenius
Si vous n'avez pas accès aux threads, alors pourquoi utilisez-vous des variables de thread pour commencer? À quoi les utilisez-vous exactement? Puisque vous ne contrôlez pas les threads, le seul moyen que je connaisse pour détecter les terminaisons de thread est d'écrire et de charger une DLL afin de pouvoir recevoir les notifications 'DLL_THREAD_DETACH'. Mais alors la DLL devrait gérer la mémoire de variable de fil, à moins que vous ne partagiez FastMM à travers la frontière de DLL. –