53 votes

Profil d'allocation de mémoire en C ++

Je suis en train d'écrire une application et je suis surpris de voir son total de l'utilisation de la mémoire est déjà trop élevé. Je veux pour le profil de la dynamique de l'utilisation de la mémoire de ma demande: le nombre d'objets de chaque type sont là, dans le tas, et les fonctions qui ont créé ces objets? Aussi, la quantité de mémoire utilisée par l'objet?

Est-il un moyen simple de faire cela? Je suis en train de travailler sur linux et windows, si les outils de l'une des plates-formes suffirait.

NOTE: je ne suis pas concerné par les fuites de mémoire ici.

25voto

fco.javier.sanz Points 1582

Avez-vous essayé Valgrind ? Il s'agit d'un outil de profilage pour Linux. Il a un vérificateur de mémoire (pour les fuites de mémoire et autres problèmes de mémoire) appelé Memcheck mais il a également un profileur de tas nommé Massif.

12voto

sth Points 91594

Pour des statistiques simples, juste pour savoir où toute la mémoire est utilisée, vous pouvez ajouter un modèle comme celui-ci:

 template<class T>
class Stats {
  static int instance_count;
public:
  Stats() {
    instance_count++;
  }
  ~Stats() {
    instance_count--;
  }
  static void print() {
    std::cout << instance_count << " instances of " << typeid(T).name() <<
        ", " << sizeof(T) << " bytes each." << std::endl;
  }
};

template<class T>
int Stats<T>::instance_count = 0;
 

Ensuite, vous pouvez ajouter ceci en tant que classe de base aux classes que vous soupçonnez d'avoir beaucoup d'instances, et imprimer des statistiques sur l'utilisation actuelle de la mémoire:

 class A : Stats<A> {
};

void print_stats() {
  Stats<A>::print();
  Stats<B>::print();
  ...
}
 

Cela ne vous montre pas dans quelles fonctions les objets ont été alloués et ne donne pas trop de détails, mais cela pourrait me suffire pour localiser où la mémoire est gaspillée.

9voto

Nitin Bhide Points 1342

Pour windows vérifier les fonctions de "crtdbg.h". crtdbg.h contient la version de débogage de fonctions d'allocation de mémoire. Il contient également de la fonction de détection des fuites de mémoire, de corruptions, de vérifier la validité des tas de pointeurs, etc.

Je pense que les fonctions suivantes seront utiles pour vous.

_CrtMemDumpStatistics _CrtMemDumpAllObjectsSince

MSDN suivant des listes de liens sur le Tas (de l'État les fonctions de Reporting et des exemples de code http://msdn.microsoft.com/en-us/library/wc28wkas(SV.80).aspx

6voto

Canopus Points 3154

Vous pouvez essayer le validateur de mémoire à partir de http://www.softwareverify.com/cpp/memory/index.html

C'est l'un des meilleurs outils que j'ai rencontrés pour profiler l'utilisation de la mémoire. La version d'évaluation de 30 jours est disponible en téléchargement gratuit.

3voto

Charlie Martin Points 62306

Vous pouvez faire plusieurs choses. La chose la plus simple est de lier une bibliothèque de débogage malloc; il en existe un certain nombre, en fonction des détails de votre environnement (par exemple, google pour _malloc_dbg pour Windows.)

Le deuxième choix est que vous pouvez surcharger new et supprimer en C ++; il est possible de surcharger le nouveau de base et de le supprimer avec de nouvelles fonctions qui suivent l'allocation et l'utilisation de la mémoire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X