Je ne suis pas trop familier avec le tas de débogage et des contrôles STL, mais quand j'ai des problèmes de mémoire dans GCC sur linux j'utiliser une variable d'environnement appelé MALLOC_CHECK_ (de malloc (3)):
récente les versions de Linux libc (plus tard que 5.4.23) et de GNU libc (2.x) incluent une implémentation de malloc qui peut être ajustée via des variables d'environnement. Lorsque MALLOC_CHECK_ est défini, une implémentation spéciale (moins efficace) est utilisée qui est conçue pour être tolérante contre les erreurs simples, telles que les doubles appels de free() avec le même argument, ou dépassements d'un seul octet (off-by -un bug). Cependant, toutes ces erreurs ne peuvent pas être protégées contre les erreurs et des fuites de mémoire peuvent en résulter. Si MALLOC_CHECK_ est défini sur 0, toute corruption de tas détectée est ignorée silencieusement; si est défini sur 1, un diagnostic est imprimé sur stderr; Si la valeur est 2, abort() est immédiatement appelé . Cela peut être utile car sinon un crash peut arriver beaucoup plus tard, et la véritable cause du problème est alors très difficile à localiser.
Il existe également une clôture électrique qui peut aider à intercepter les dépassements de tampon dès que le dépassement/le dépassement se produit. Voir libefence(3) pour plus d'informations.
C'est exactement ce que fait le tas Debug Peter, merci! Savez-vous si ces vérifications sont également effectuées pour le nouveau/supprimer? – rpg
Cela se fait dans mon implémentation (l'opérateur delete, au moins, semble avoir un appel sous-jacent à free(), donc il attrape le double-free). Clôture électrique attrape définitivement les dépassements de mémoire tampon avec la mémoire allouée par l'opérateur nouveau. –
Notez que glibc 2.10 et 2.11 sont buggué: MALLOC_CHECK_ peut provoquer des blocages et des crash de programmes multithread. – ephemient