Le programme C ++ meurt avec std :: bad_alloc, mais Valgrind ne signale aucune fuite de mémoire

Mon programme échoue avec le message d’erreur ‘std :: bad_alloc’. Le programme est évolutif, j’ai donc testé sur une version plus petite avec valgrind et il n’y a aucune fuite de mémoire.

Il s’agit d’une application de la mécanique statistique, c’est pourquoi je crée en principe des centaines d’objects, modifie leurs données internes (dans ce cas, des vecteurs stl de doublons) et écrit dans un fichier de données. La création d’objects se situe à l’intérieur d’une boucle. Ainsi, lorsqu’elle se termine, la mémoire est libre. Quelque chose comme:

for (cont=0;cont<MAX;cont++){ classSection seccion; seccion.GenerateObjects(...); while(somecondition){ seccion.evolve(); seccion.writedatatofile(); }} 

Il existe donc deux variables qui définissent le temps de calcul du programme, la taille du système et le nombre de cycles. Il n’y a qu’un crash pour les gros systèmes avec de nombreuses exécutions. Des idées sur la façon d’attraper ce problème de mémoire?

Merci,

Exécutez le programme sous le débogueur pour qu’il s’arrête une fois cette exception levée et que vous puissiez observer la stack d’appels.

Les trois problèmes les plus probables sont:

  • fragmentation en tas
  • trop d’objects créés sur le tas (mais toujours signalés par le programme)
  • une demande pour un bloc de mémoire déraisonnablement grand

valgrind ne montrerait pas de fuite de mémoire car vous pourriez ne pas en avoir une que valgrind en trouverait.

Vous pouvez réellement avoir des memory leaks dans des langages comme Java. Bien que la mémoire soit nettoyée là-bas, cela ne signifie pas qu’un mauvais programmeur ne peut pas conserver indéfiniment des données dont il n’a plus besoin (par exemple, créer une carte de hachage indéfiniment). Le ramasse-miettes ne peut pas déterminer que l’utilisateur n’a plus vraiment besoin de ces données.

Vous faites peut-être quelque chose comme ça ici, mais nous aurions besoin de voir plus de votre code.

À propos, si vous avez une collection qui contient vraiment une masse de données, il vaut souvent mieux utiliser std :: deque plutôt que std :: vector, à moins que vous ayez vraiment besoin que tout soit contigu.