La plus simple façon de compter les occurrences d'un objet
Je voudrais savoir le nombre exact d'occurrences de certains objets alloués à certain moment de l'exécution. Surtout pour la chasse possible les fuites de mémoire(j'utilise principalement la RAII, presque pas de nouvelles, mais encore j'aurais pu oublier .clear() sur le vecteur avant d'ajouter de nouveaux éléments ou quelque chose de similaire). L'Ofc je pourrais avoir un
atomic<int> cntMyObject;
que j' -- dans le destructeur, ++ augmentation du constructeur, cpy constructeur(j'espère que j'ai recouvert le tout :)).
Mais c'est coder en dur pour chaque classe. Et il n'est pas simple de faire le désactiver en mode "Release".
Donc, il y a toute simple élégant qui peut être facilement désactivé pour compter les instances d'objet?
- Pourquoi ne pas utiliser un profil pour trouver des fuites de mémoire?...
- Pas l'opérateur d'affectation, il ne faut pas modifier le nombre d'objets existants du type, juste modifie la valeur de l'un d'eux.
- Autant que je trouve l'idée de l'ajout d'un objet global contre intéressant, je dirais que pour la pratique de votre problème de l'élimination des erreurs de mémoire, l'exécution de votre programme par Valgrind serait beaucoup plus facile d'approche de la solution, avec plus de messages significatifs, trop.
- Si vous pensez que quelque chose comme google HEAPProfiler-c'est sympa, mais une fois que j'ai foiré STL trucs(non thread-safe mises à jour)et il n'a pas de détecter les fuites(ça m'a aidé à les trouver car j'ai remarqué que les cercles sont de plus pour le rechargement de la même chose). Aussi, je ne sais pas comment mettre l'accent sur certains de la classe dans HeapProfiler, je ne connais que de générer de "l'ensemble du programme mem utilisation".
- Êtes-vous prêt à accepter compilateur solutions spécifiques? Je peux offrir une non intrusif gcc un et il y a une fonction similaire pour msvc trop.
- Oui, Im en utilisant gcc g++), ofc, je préfère toujours "dans la norme" solutions
- À l'aide du générateur de profils n'est pas la réponse ici. Que le demandeur a mentionné oublier un vecteur.clear() sera toujours un problème. Sinon il n'y aurait pas de fuites de mémoire dans les programmes Java. C'est pas le type en C++ les fuites, mais c'est un problème important et il a besoin d'un total de différents outils pour le résoudre alors valgrind etc.
Vous devez vous connecter pour publier un commentaire.
Ont un "compté objet" de la classe qui fait le calcul de référence approprié dans son constructeur(s) et le destructeur, alors déduire de vos objets que vous souhaitez suivre à partir d'elle. Vous pouvez ensuite utiliser l'curieusement récurrents de modèle de modèle pour obtenir des comptes distincts pour tous les types d'objet que vous souhaitez suivre.
#ifdef NDEBUG
qui s'appuie sur laassert()
définir. Ou vous pouvez utiliser un Trait de caractère sur un booléen, simplement d'activer ou de désactiver le code de Débogage ou de Production. Mais ce n'est pas "simple" plus. Si vous êtes intéressé de toute façon, je peux coller un morceau de l'exemple de code ici. Tout ce que vous êtes nécessaire à faire est de définir lesstatic const bool debug = true
oufalse
, et yo dispositions de deux spécialisations de modèle pourCountedObj
: l'Un est complètement vide, l'un avec de débogage de code n'.if(this != &obj)
-- comment cela pourrait-il plus false?total_
?Préférable d'utiliser le profilage de la mémoire & détection de fuite d'outils comme Valgrind ou Rationnelle Purifier.
Si vous ne pouvez pas et que vous voulez mettre en place votre propre mécanisme,
Vous devez surcharger la
new
etdelete
opérateurs pour votre classe, puis de mettre en œuvre le diagnostic de la mémoire en eux.Ont un coup d'oeil à cette C++ FAQ réponse pour savoir comment faire et quelles sont les précautions que vous devez prendre.
std::bad_alloc
en cas de panne?vous pouvez appliquer cette approche
à
DEBUG
mode, en invoquant deObjectCount::showCount()
méthode retourne compter de l'objet créé(s)C'est une sorte de travail exemple de quelque chose de similaire: http://www.almostinfinite.com/memtrack.html (il suffit de copier le code à la fin de la page et de la mettre dans Memtrack.h, puis exécutez TrackListMemoryUsage() ou l'une des autres fonctions à voir diagnostic)
Il remplace l'opérateur new et fait des arcanes de la macro choses à faire "timbre" chaque allocation avec les informations qui permettent de compter le nombre d'instances d'un objet et la quantité de mémoire qu'ils sont usingusing. Il n'est pas parfait, mais, les macros ils utilisent briser sous certaines conditions. Si vous décidez de l'essayer assurez-vous d'inclure après tout des en-têtes standard.
Sans connaître votre code et de vos exigences, je vois 2 options raisonnables:
a) Utiliser
boost::shared_ptr
. Il a la atomique, le nombre de références que vous avez suggéré intégré et prend en charge votre gestion de la mémoire (de sorte que vous n'avais jamais réellement soin de regarder le comte). Son nombre de références est disponible par le biais de lause_count()
membre.b) Si les conséquences d'un), par exemple en présence de pointeurs et d'avoir
shared_ptrs
partout, ou possible des performances, ne sont pas acceptables pour vous, je vous suggère de simplement utiliser les outils disponibles pour la mémoire de détection de fuite (par exemple Valgrind, voir ci-dessus) qui va déclarer vos objets en vrac à la sortie du programme. Et il n'y a pas besoin d'utiliser intrusif des classes d'aide pour (de toute façon de débogage uniquement) suivi des décomptes d'objet, qui vient de gâcher votre code, à mon humble avis.Que nous avons utilisés pour la solution d'une classe de base avec compteur interne et en tirer, mais nous avons changé tout cela dans boost::shared_ptr, il maintient un compteur de référence et il nettoie la mémoire pour vous. Le coup de pouce de pointeur intelligent de la famille est très utile:
des pointeurs intelligents de boost
Mon approche, qui sort de fuite à compter de la Sortie de Débogage (via le DebugPrint fonction implémentée dans notre base de code, remplacez-la avec votre propre...)
Exemple d'utilisation: