2010-12-08 29 views
3

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 pas de fuites de mémoire.Le programme C++ meurt avec std :: bad_alloc, MAIS valgrind ne signale aucune fuite de mémoire

Ceci est une application de la mécanique statistique, donc je fais fondamentalement des centaines d'objets, en changeant leurs données internes (dans ce cas stl des vecteurs de doubles), et en écrivant dans un fichier de données. La création d'objets se trouve à l'intérieur d'une boucle, alors quand 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(); 
     }} 

Donc il y a deux variables qui définissent le temps de calcul du programme, la taille du système et le nombre de pistes. Il y a seulement un crash pour les gros systèmes avec beaucoup de runs. Des idées sur la façon d'attraper ce problème de mémoire?

Merci,

+1

Quels types de valeurs sont utilisés pour MAX en cas d'échec? Peut-être que vous manquez de mémoire? – wallyk

+0

Vous pouvez manquer d'espace d'adressage sans avoir de fuite dans votre programme. –

+0

MAX est de l'ordre de centaines, pour un système «gros», quand il échoue. – Gabriel

Répondre

3

exécuter le programme sous débogueur afin qu'il arrête une fois cette exception est levée et vous pouvez observer la pile d'appel.

Trois problèmes les plus probables sont les suivantes:

+2

Notez que "une demande pour un bloc de mémoire déraisonnablement grand" pourrait également être une requête pour un bloc de mémoire de taille négative, avec le nombre négatif implicitement converti en 'size_t' (qui est un type non signé). –

+0

Mais une telle requête serait montrée par valgrind comme un avertissement non? – Gabriel

+0

Merci à sharptool. Des suggestions sur la façon de vérifier s'il y a trop d'objets créés sur le tas? – Gabriel

3

valgrind ne montrer une fuite de mémoire parce que vous pourriez bien ne pas en avoir un que valgrind trouverait.

Vous pouvez réellement avoir des fuites de mémoire dans des langages collectés dans des ordures comme Java. Bien que la mémoire soit nettoyée là-bas, cela ne signifie pas qu'un mauvais programmeur ne peut pas indéfiniment conserver indéfiniment des données dont il n'a plus besoin (par exemple, construire une table de hachage indéfiniment). Le garbage collector 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. A propos, si vous avez une collection qui a vraiment des masses de données, il vaut mieux utiliser std :: deque plutôt que std :: vector sauf si vous avez vraiment besoin que tout soit contigu.

+0

Merci CashCow. Je pense que les objets ont été effacés chaque fois que la boucle est autour, mais je suppose qu'il y a quelque chose qui n'est jeté qu'à la fin du programme. Je ne peux pas publier le code ici. Je vais essayer les deques aussi. – Gabriel