J'essaie de détecter les fuites de mémoire en surchargeant globalement new et delete pour les builds de débogage et en maintenant une liste des blocs alloués. Cela fonctionne, mais signale incorrectement des fuites pour certains objets statiques. Par exemple, un vecteur statique std :: lui-même n'est pas alloué en utilisant new et delete, mais ses tampons internes le sont. Comme mon code de détection s'exécute avant le retour de la fonction principale, les destructeurs de ces objets ne sont pas encore appelés, ils n'ont donc pas encore supprimé leurs tampons et cela apparaît comme une "fuite".Comment traiter les objets statiques lors de la surcharge et de la suppression pour trouver des fuites de mémoire?
Une solution que j'ai trouvé est en supprimant et le placement newing chaque objet statique pour effacer leurs tampons avant de vérifier les fuites:
std::vector<int> f;
f.~std::vector<int>();
new (&f) std::vector<int>();
C'est vraiment laid et bien y compris le code de nettoyage qui n'est pas requis semble mauvais. Existe-t-il un moyen d'exécuter mon code une fois que les statistiques ont été détruites? (même si c'est spécifique à Microsoft)
Comment cela aiderait-il? Je consignation les allocations, theres juste aucun moyen de faire le contrôle de fuite final après que les objets statiques ont été détruits – Lucas
L'allocateur est en fait l'entité qui gère la mémoire pour les conteneurs. Implémentez votre allocateur de "détection de fuite" et donnez-le à l'instanciation du conteneur. Ne vous inquiétez pas pour les objets statiques eux-mêmes - ils sont alloués au moment de la compilation. –
Oh je vois, je pourrais donner à tous les conteneurs statiques un autre allocateur qui les exclurait d'être suivis. Ouais cela fonctionnerait, mais cela exigerait que je change beaucoup de code partout dans mon système en raison du fait que l'allocateur est un paramètre de modèle. – Lucas