2010-03-21 3 views
0

J'ai un code qui doit être "traduit" de C à Cpp, et je ne comprends pas, où est un problème. Il y a la partie, où il se bloque (fenêtres erreur critique Envoyer/dontSend):Problème d'allocation de mémoire C/Cpp Windows erreur critique

nDim = sizeMax*(sizeMax+1)/2; 
printf("nDim = %d sizeMax = %d\n",nDim,sizeMax); 
hamilt = (double*)malloc(nDim*sizeof(double)); 
printf("End hamilt alloc. %d allocated\n",(nDim*sizeof(double))); 
transProb = (double*)malloc(sizeMax*sizeMax*sizeof(double)); 
printf("End transProb alloc. %d allocated\n",(sizeMax*sizeMax*sizeof(double))); 
eValues = (double*)malloc(sizeMax*sizeof(double)); 
printf("eValues allocated. %d allocated\n",(sizeMax*sizeof(double))); 
    eVectors = (double**)malloc(sizeMax*sizeof(double*)); 
printf("eVectors allocated. %d allocated\n",(sizeMax*sizeof(double*))); 
if(eVectors) for(i=0;i<sizeMax;i++) { 
       eVectors[i] = (double*)malloc(sizeMax*sizeof(double)); 
       printf("eVectors %d-th element allocated. %d allocated\n",i,(sizeMax*sizeof(double))); 
       } 
eValuesPrev = (double*)malloc(sizeMax*sizeof(double)); 
printf("eValuesPrev allocated. %d allocated\n",(sizeMax*sizeof(double))); 
eVectorsPrev = (double**)malloc(sizeMax*sizeof(double*)); 
printf("eVectorsPrev allocated. %d allocated\n",(sizeMax*sizeof(double*))); 
if(eVectorsPrev) for(i=0;i<sizeMax;i++) { 
        eVectorsPrev[i] = (double*)malloc(sizeMax*sizeof(double)); 
        printf("eVectorsPrev %d-th element allocated. %d allocated\n",i,(sizeMax*sizeof(double))); 
        } 

Log:

nDim = 2485 sizeMax = 70 
End hamilt alloc. 19880 allocated 
End transProb alloc. 39200 allocated 
eValues allocated. 560 allocated 
eVectors allocated. 280 allocated 

Il se bloque au début de la boucle d'allocation. Si je supprime cette boucle, elle se bloque à la prochaine ligne d'allocation. Est-ce que ça veut dire qu'avec les chiffres comme ça je n'ai pas assez de mémoire?

Merci.

+0

argh .. un meilleur formatage s'il vous plaît! – Macke

Répondre

1

Sur mon ordinateur, ce programme se compile, s'exécute sans erreur et ne signale aucun problème de mémoire lors de l'exécution de valgrind. Sauf si vous utilisez un petit système embarqué, votre problème est probablement quelque chose d'extérieur à ce code, car la quantité totale de mémoire allouée par ce programme est inférieure à 140 KiB. En outre, lorsque malloc échoue, il ne plante pas, il renvoie NULL. Ce code vérifie correctement que eVectorsPrev est NULL, il ne devrait donc pas y avoir de problèmes de déréférencement NULL ici.

+0

>> est inférieur à 140 KiB. exactement. En fait, avant cela, il y a de la place, mais des tailles plus ou moins identiques. Dites-moi, s'il vous plaît, y a-t-il des possibilités pour voir si j'ai perdu la mémoire? Ou comment puis-je "attraper" la raison de l'accident? Et un de plus: je viens de remarquer que la version C est normalement compilée par le même compilateur de mon DevC++ malgré les lignes comme \t hamilt = malloc (nDim * sizeof (double)); sans précision le type. Est-ce normal? Ou ai-je occasionné des réglages étranges du compilateur? – Andrew

+0

désolé pour le format, je ne comprends pas comment le faire dans les commentaires ... – Andrew

+0

Les variables comme 'hamilt' doivent avoir leur type déclaré * quelque part * sinon il ne serait pas compiler. Ils peuvent être des paramètres de la fonction ou des globales. Pour détecter les problèmes de corruption de la mémoire (ce qui est probablement le cas) et/ou pour connaître la quantité de mémoire utilisée, utilisez un profileur/débogueur de mémoire. J'utilise valgrind, mais c'est sur Linux. Ce post a quelques bonnes suggestions pour les outils de type valgrind pour windows: http://stackoverflow.com/questions/413477/is-there-a-good-valgrind-substitute-for-windows –

1

Vous n'essayez probablement pas d'allouer trop de mémoire. Un autre code a probablement corrupted the heap et peut mordre à peu près n'importe quel point arbitraire dans le code après. Voir le lien pour les aides au débogage.

Si vous manquiez de mémoire dans un programme sans défaut, malloc renverrait une indication d'erreur.

0

Qu'est-ce que sizeMax? Je ne vois pas la déclaration, veuillez corriger le formatage. Une note de côté ... vous appelez aveuglément malloc sans vérifier si cela a fonctionné ou non ... c'est une supposition dangereuse - ne supposez jamais qu'il y a beaucoup de mémoire disponible car le tas pourrait devenir très fragmenté et quand un appel à malloc pour un très petit objet dans un tas fragmenté pourrait échouer car il n'y a pas assez de mémoire ...