J'ai créé DLL en C# 3.5 qui effectue des calculs matriciels intensifs en mémoire où les matrices sont créées et éliminées. Tout fonctionne bien si dll est appelée à partir de l'application .Net mais si elle est appelée à partir de C++, l'utilisation de la mémoire de l'application créée ne fait que grimper jusqu'à ce que la fonction utilisant les matrices soit terminée. Je suppose qu'il y a un problème avec une collecte automatique des ordures.Problème de mémoire en C#, utilisation normale si DLL est appelée par l'application .Net mais astronomique si dll est appelée depuis l'application existante
Répondre
Il est très probable que vous ne libérez pas les références aux encapsuleurs d'objets .Net à partir de votre application non gérée. Le GC ne peut pas collecter cette mémoire à moins que toutes les références (y compris les références externes) soient libérées.
Expansion de la réponse de la logique.
Le CLR peut uniquement ramasser la mémoire qui est allouée et possédée par le code managé. Il n'a aucune vue ou compréhension de la mémoire non gérée. Dans le cas de C++ appelant une DLL .Net via COM interop vous avez un mélange de mémoire gérée et non managée. De plus, vous avez des objets C++ qui conservent les objets gérés en vie (via des pointeurs COM et CCW). Le CLR libère les objets gérés correctement, mais uniquement lorsqu'aucune référence n'existe plus. Lorsque C++ accède à un objet géré, il crée un CCW sous le capot qui est maintenu actif par le pointeur d'interface COM C++ natif. Jusqu'à ce que le compte ref sur ce pointeur atteigne 0 via des appels à Release et Add, il maintient le CCW en vie et donc l'objet géré sous-jacent.
Essayez d'envelopper tous les endroits dans C++ où vous accédez à votre objet géré avec un CComPtr et voir si cela prend soin de votre problème.
- 1. Comment accéder au système de fichiers depuis une DLL .NET appelée par ASP classique?
- 2. DLL de débogage appelée avec CeRapiInvoke
- 3. Comment vérifier si DLL est compilé debug-
- 4. Comment savoir si dll RAPI est existant
- 5. Rhino Mocks - Définit une propriété si une méthode est appelée
- 6. DllNotFoundException, mais DLL est là
- 7. méthode est appelée
- 8. DLL C++ très simple qui peut être appelée à partir de .net
- 9. C++ dll Loop Problème
- 10. Puis-je savoir si une vue est appelée par le django TestClient
- 11. C++: Problème de déchargement Dll
- 12. C++ DLL appelée à partir de C# sur Windows CE pour ARM Toujours renvoie 0
- 13. Vérifiez si une bibliothèque DLL est déjà chargée? (Java)
- 14. Dépassement de pile de la DLL native appelée à partir de l'application gérée
- 15. C#: Combien de fois la valeur foreach est appelée?
- 16. Comment puis-je vérifier si une bibliothèque (dll) est disponible en C#?
- 17. Identifiez si un fichier (dll/exe) est verrouillé ou non par un processus ou une bibliothèque
- 18. Spring La sécurité est appelée à partir de différentes sources
- 19. Comment savoir si une DLL donnée est chargée par un processus donné?
- 20. Comment savoir si le fichier .exe chargé par ma DLL est sur le point de sortir?
- 21. Devrais-je utiliser un moq juste pour tester si une méthode est appelée?
- 22. est-classe étant appelée d'une autre classe
- 23. Utilisation d'une DLL avec l'en-tête .h en C++
- 24. si vous avez une DLL créant un bitmap en mémoire, comment le renvoyer au navigateur?
- 25. Chargement de la DLL C# par réflexion, mais appli App.config
- 26. Pourquoi ma méthode C# n'est pas appelée?
- 27. dll problème
- 28. Comment trouvez-vous l'URL de base d'une DLL en C#?
- 29. DataGridView n'appelle pas la méthode Paint lorsque InvalidateCell est appelée
- 30. Comment éviter toute fuite de mémoire pour la classe Objective-C qui est appelée par beaucoup d'autres classes
Je ne comprends pas, ces nouveaux objets ont été créés en tant que variables locales! Pourquoi sont-ils toujours dans la mémoire après que la fonction soit terminée? Btw, quand j'appelle explicitement .Dispose() sur la plus grande situation de porcs de mémoire obtient beaucoup mieux. –
Les variables locales peuvent contenir des références à des objets non gérés qui ne sont libérés que lorsque Dispose est appelé ou lorsque le GC intervient (en supposant que vous utilisez le modèle Dispose standard). – logicnp