En général, qu'est-ce qui pourrait causer un double free dans un programme qui ne contient pas d'allocation dynamique de mémoire ?
Pour être plus précis, aucun des mon utilise l'allocation dynamique. J'utilise la STL, mais il est beaucoup plus probable que ce soit quelque chose que j'ai mal fait que ce soit une implémentation défectueuse de G++/glibc/STL.
J'ai fait des recherches pour essayer de trouver une réponse à cette question, mais je n'ai pas pu trouver d'exemple de cette erreur générée sans aucune allocation de mémoire dynamique.
J'aimerais partager le code qui génère cette erreur, mais je ne suis pas autorisé à le publier et je ne sais pas comment réduire le problème à quelque chose d'assez petit pour être donné ici. Je vais faire de mon mieux pour décrire l'essentiel de ce que faisait mon code.
L'erreur était déclenchée à la sortie d'une fonction, et la trace de la pile montrait qu'elle provenait du destructeur d'une fonction de type std::vector<std::set<std::string>>
. Un certain nombre d'éléments du vecteur ont été initialisés par emplace_back()
. Dans une ultime tentative, je l'ai changé en push_back({{}})
et le problème a disparu. Le problème peut également être évité en définissant la variable d'environnement MALLOC_CHECK_=2 . D'après ce que j'ai compris, cette variable d'environnement aurait dû faire en sorte que la glibc abandonne avec plus d'informations plutôt que de faire disparaître l'erreur.
Cette question n'est posée que pour satisfaire ma curiosité, je me contenterai donc d'une réponse approximative. Le mieux que j'ai pu trouver est qu'il s'agit d'un bug du compilateur, mais c'est toujours ma faute .