Je rencontre actuellement un problème dans lequel j'obtiens
*** glibc detected *** ./efit: free(): invalid next size (fast): 0x00000000006127f0 ***
avec les informations habituelles sur la carte mémoire et le backtrace qui accompagnent un glibc
Je n'arrive cependant pas à trouver la cause de ce problème. il semble que (pratiquement) tout mon programme soit terminé au moment où cela se produit. une chose que j'ai lue en ligne est que cela pourrait être dû à un manque de désallocation.
J'ai exécuté le programme sans désallouer quelques-uns de mes tableaux (j'avais l'impression que la désallocation pouvait provoquer des fuites de mémoire, mais que cela n'affecterait que les performances et l'efficacité du programme pendant qu'il s'exécute).
Est-il possible que mes exécutions précédentes du programme sans désallouer mes tableaux reviennent me hanter dans le sens où il y a de la mémoire non libérée des exécutions précédentes sur laquelle j'essaie d'écrire ?
Si ce n'est pas le cas, je suis complètement déconcerté par cette erreur. Des indices sur l'endroit où je devrais commencer à chercher et/ou sur la façon dont je devrais déboguer pour trouver l'erreur ?
pour ce que cela vaut, j'utilise gfortran pour compiler
EDIT : les options de compilation n'ont pas permis d'identifier directement ce problème au départ, mais elles m'ont aidé à l'atténuer. j'utilisais une variable entière. iat
pour iat=1,natoms
dans un do
et quelques lignes plus loin, il s'est dit iat
décrivait un autre nombre entier dans les limites de la 1,natoms
Lorsque j'ai corrigé quelques-uns des avertissements listés par vos options de compilation, cette erreur s'est transformée en une description beaucoup plus claire de l'erreur : Fortran runtime error: Index '7' of dimension 1 of array 'isnormed' above upper bound of 6
.
Qu'est-ce qui a empêché cette erreur de se produire la première fois ? Les seules modifications que j'ai apportées à reach et qui m'ont été signalées par les avertissements de compilation sont les suivantes read(fout, '(a)'), line100' to
read(fout, '(a)') line100' (en supprimant la virgule) et en modifiant l'ancien style de description des caractères character*100 line100
vers les plus récents character(100) line100
descriptions.