2009-11-19 18 views
0

J'ai débogué mon other problem au constructeur MyMesh. Dans ce code:bad_alloc exception lors de la tentative d'impression des valeurs

if (hollow) { 
    numTriangles = n*8; 
    triangles=new MyTriangle[numTriangles]; 
    if (smooth) numSurfacePoints=n*8; 
    else numSurfacePoints=n*12; 
    surfacePoints=new SurfacePoint[numSurfacePoints]; 
}else { 
    numTriangles = n*4; 
    triangles=new MyTriangle[numTriangles]; 
    if (smooth){ 
     numSurfacePoints=n*4; 
     surfacePoints=new SurfacePoint[numSurfacePoints]; 
     surfacePoints[n*4]=SurfacePoint(vector3(0,0,1),vector3(0,0,1)); 
     surfacePoints[n*4+1]=SurfacePoint(vector3(0,0,-1),vector3(0,0,-1)); 
    }else{ 
     numSurfacePoints=n*6; 
     surfacePoints=new SurfacePoint[numSurfacePoints]; 
     surfacePoints[n*6]=SurfacePoint(vector3(0,0,1),vector3(0,0,1)); 
     surfacePoints[n*6+1]=SurfacePoint(vector3(0,0,-1),vector3(0,0,-1)); 
    } 
} 

Je détermine les points de surface et les triangles nécessaires pour le maillage. Les bols "creux" et "lisse" indiquent, si j'ai besoin d'un trou dans le cône, ou si les normales sont les mêmes, mais je pense que c'est irréfléchi.

Le problème est le suivant: si creux == faux, il fait quelque chose de mal, mais ne se bloque, il permet même de mettre les valeurs dans les tableaux, mais quand je suis en train de comme ça cout:

for(int i=0;i<numSurfacePoints;i++){ 
    std::cout<<"vertex "<<i<<"-> pos:"<<surfacePoints[i].pos.x<<" "<< 
     surfacePoints[i].pos.y<<" "<<surfacePoints[i].pos.z<< 
     " norm:"<<surfacePoints[i].norm.x<<" "<<surfacePoints[i].norm.y<< 
     " "<<surfacePoints[i].norm.z<<"\n"; 
} 

il déclenche une exception bad_alloc, juste quand i = 0.

En outre, il y avait un temps, quand le segment de code supérieur a jeté un bad_alloc à l'opérateur nouveau, mais ce problème vient de se résoudre, mais c'est peut-être pertinent.

Quelqu'un peut-il m'aider?

+0

pouvez-vous écrire ce que vous faites si creuse == faux? – Ashish

Répondre

0

Combien coûte n? C'est là que la quantité de surfacePoints est calculée par ...

+0

par exemple 4. mais si ce n'est pas creux, alors même 20 est ok –

2

Vous allouez de la mémoire pour N points de surface, puis alors comment pouvez-vous attribuer une valeur à N e et N + 1 point?

S'il vous plaît mettre chèque de conditions liées array ...

+0

Oh, merci beaucoup! Je le cherchais pendant des heures, mais c'était basique ... bah ... En tout cas, merci beaucoup! –

1

Vous écrivez en dehors de la mémoire allouée.

Avec

numSurfacePoints=n*4; 
    surfacePoints=new SurfacePoint[numSurfacePoints]; 

la plage d'index valide, vous pouvez utiliser est [0 ... (n * 4 - 1)] (par exemple, pour n = 10, vous pouvez utiliser l'index [0..39])

mais vous écrivez

surfacePoints[n*4]=SurfacePoint(vector3(0,0,1),vector3(0,0,1)); 
    surfacePoints[n*4+1]=SurfacePoint(vector3(0,0,-1),vector3(0,0,-1)); 

tous deux aller au-delà (même chose se produit avec le cas lisse), soit pour n == 10 vous écrire à l'index 40 et 41.

Ainsi, vous corrompez le tas (la mémoire est d'où viennent les 'nouveaux'). Selon la disposition de la mémoire (qui peut varier d'une exécution à l'autre), vous écrasez les données qui appartiennent à quelqu'un d'autre (soit le tas, soit une autre partie de votre programme). En fonction de la mise en page, il se bloque tout de suite, ou pose la graine à un crash ou à un problème plus tard. Dans votre cas, lorsque vous faites la sortie, la bibliothèque d'exécution alloue également (appelez malloc ou new) pour obtenir de la mémoire pour ce qu'elle fait et le système de tas remarque que quelque chose ne va pas (vous avez écrasé certaines données système de tas a besoin de gérer les morceaux de mémoire) et lève l'exception.

0

Il semble que votre tas soit corrompu. Vérifiez que vous ne supprimez pas les pointeurs alloués plusieurs fois. Ne pas accéder aux éléments hors-limites des tableaux. Ne pas accéder aux pointeurs supprimés, etc.