Question

Quelqu'un a suggéré récemment ( Mon programme ne libère la mémoire de retour. Pourquoi ) que mon programme fuites de la mémoire. Je FastMM ensemble à agressif et il ne signale aucune fuite de mémoire quand je d'arrêt du programme.

Quoi qu'il en soit, je voudrais savoir s'il peut y avoir des fuites de mémoire qui ne sont pas détectés par FastMM?

Mise à jour: je ne l'utilise pas personnellement API Win pour allouer de la mémoire. Mais je crains que certains composants 3ème partie j'utiliser (pas beaucoup) peuvent l'utiliser. Pouvez-vous me faire savoir tous les appels API possibles que FastMM ne peut pas intercepter? Je vais faire une recherche dans mon code pour eux. Merci.


Delphi 7, Windows 7 32 bits
FastMM 4,97
Je ne suis pas intéressé sur les interfaces.

Était-ce utile?

La solution

Non, seules les fuites de mémoire dont la mémoire a été alocated par FastMM.

EDIT: Peut-être que les regards de réponse enveloppé mais ce n'est pas! Si quelqu'un vérifie la FastMM Haw est faite que peut voir que chaque pointeur de alocation mémoire est poussé (et poped sur à FreeMem) pour l'une des piles (il y a plus de piles, dépendent de la taille de la mémoire) afin à la fin de l'application de la fermeture FastMM ne vérifier les piles, si quelque chose en piles, et si elle est, que la fuite de mémoire de rapport!

Autres conseils

FastMM est une couche sur le dessus de la gestion de la mémoire de Windows. De toute évidence, si vous (ou un composant ou autre) utilise des API Windows pour allouer de la mémoire, alors cette allocation FastMM et court-circuite vous ne serez pas en mesure de le suivre. BTW gestionnaires de mémoire Delphi utilisent eux-mêmes que les API pour allouer des morceaux de mémoire. Donc, si vous avez besoin de voir les allocations à ce niveau, FastMM ne suffit pas - vous devez utiliser des outils comme AQtime et similaires (comme je l'ai suggéré dans la question précédente).

Je ne l'ai jamais connu FastMM à ne pas détecter une fuite de mémoire.

Il y a plusieurs causes possibles: (applicables à tout gestionnaire de mémoire)

  • votre principale fuites boucle de programme mémoire, mais le fait de quelque chose qui est libéré à l'arrêt
    • le cas le plus simple est l'exploitation forestière à une note de service. La note de service devient de plus en plus, mais est détruite à l'arrêt.
  • la mémoire est allouée au contrôle de l'extérieur FastMM
    • allocation directement des fenêtres
    • mémoire allouée dans dll etc.
  • Heapfragmentation. Un gestionnaire de mémoire conserve les grands blocs alloués (par exemple, car il contient encore une petite% des allocations). Résultat: L'application ne l'utilise pas, mais il est pas communiqué au système d'exploitation soit. Le moteur d'exécution / memoryManager- maintient autour.
    • FastMM devrait être plus résistant contre ce phénomène, mais essayer d'imprimer doute informations heapmanager pour voir si tel est le cas.

Il y a beaucoup de bonne réponse déjà, mais un point qui n'a pas été encore ... mentionné

Il y a beaucoup de « fuites » qui ne seront pas détectés par la plupart détecteur de fuite de mémoire car la mémoire est libérée, mais bien après il ne sert plus. Pour exemple, l'objet empilé dans un TObjectList. Object sont placés dans la liste des objets, mais après que vous les utilisez, vous ne les libère pas. Ils seront détruits lorsque la liste d'objets est détruit trop (Lorsque l'application étroite pour exemple, en supposant OwnsObject = True). Étant donné que les objets sont effectivement libérés, les objets ne sont pas « fuite », mais toujours faire votre utilisation d'applications de plus en plus de mémoire au fil du temps.

FastMM ne rapportera pas ceux qu'il ne fait que l'analyse « l'exécution complète ». Pour détecter ceux-ci, vous avez besoin d'un détecteur de fuite de mémoire qui permet de faire des courses partielles, qui est, d'analyser ce « fuite » entre le point A et le point B lors de l'exécution. AQtime qu'Eugène permettre ce genre mentionné des chèques. Mais il faut savoir qui est prend un peu d'analyse, car qui donnera beaucoup de faux positifs (Quasiment toutes les opérations de « realloc » seront marqués comme une fuite).

FastMM ne détecte pas les fuites d'allocations de mémoire ne passe pas par FastMM.

Cela peut inclure des appels GlobalAlloc de bibliothèques 3ème partie ou DLL que vous utilisez.
Modifier : MSDN de Microsoft a ma réponse à votre question précédente FastMM.

Vous pouvez utiliser un outil comme VMMap pour suivre les fuites de mémoire que FastMM ne peut pas détecter.

- jeroen

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top