2009-11-19 10 views
0

other problemMyMesh 생성자로 디버깅했습니다. 이 코드에서 :값을 인쇄하려고 할 때 bad_alloc 예외가 발생했습니다

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)); 
    } 
} 

메쉬의 필수 SurfacePoints와 삼각형을 결정했습니다. bool "hollow"와 "smooth"는 원뿔에 구멍이 필요하거나 법선이 같은 경우를 가리 킵니다. 그러나 나는 그것이 무의미하다고 생각합니다.

문제는 : hollow == false 인 경우 문제가 발생하지만 크래시가 발생하지 않고 배열에 값을 넣을 수 있지만 이럴 경우 다음과 같이 말합니다.

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"; 
} 

i = 0 일 때 bad_alloc 예외가 발생합니다.

추가적으로, 상위 코드 세그먼트가 new 연산자에 bad_alloc을 던진 시간이 있었지만 그 문제는 방금 해결되었지만 관련성이 있습니다.

아무도 도와 줄 수 있습니까?

+0

중공 == 거짓 인 경우 수행중인 작업을 기록해 둡니까? – Ashish

답변

0

얼마입니까? n은 얼마입니까? 그것이 표면 지점의 양이 계산하는 곳입니다 ...

+0

예를 들면 4. 그러나 중공이 아닌 경우 20 개도 괜찮습니다. –

2

너는 N 서피스 포인트에 메모리를 할당하고 있습니까? 그래서 N 번째와 N + 1 번째 포인트에 값을 할당 할 수 있습니까?

배열 제한 조건을 벗어 났는지 확인하십시오 ...

+0

아, 정말 고마워요! 나는 몇 시간 동안 그것을 찾고 있었다. 그러나 그것은이 기본이었다. .. 바. .. 어떻게해서든지, 많이 고마워한다! –

1

할당 된 메모리 외부에 쓰고 있습니다. (예를 들어, 사용자가 인덱스를 사용할 수 N에 대한 = 10 [0..39]) -

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

사용할 수있는 유효한 인덱스 범위

는 [(1, N * 4) ... 0] 인

하지만 당신은 모두가 (같은이 부드러운 케이스 일)을 넘어

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)); 

쓰기는, 즉, n 개의 == 10 당신은 지수 40 (41)

,369 쓰기

그래서 힙을 망가 뜨리고 있습니다 (메모리는 새로운 것이 들어오는 곳입니다). 메모리 레이아웃 (실행마다 다를 수 있음)에 따라 다른 사람 (힙 또는 프로그램의 다른 부분)에 속한 데이터를 덮어 씁니다. 레이아웃에 따라 충돌이 즉시 발생하거나 시드를 나중에 충돌 또는 문제에 놓습니다.

당신이 출력을 할 때, 런타임 라이브러리는 또한 무엇을하고 있는지에 대한 메모리를 얻기 위해 malloc이나 new를 할당 할 것이고 힙 시스템은 뭔가 잘못되었다는 것을 알아 차릴 것입니다. 힙 시스템은 메모리 덩어리를 관리해야 함) 예외를 throw합니다.

0

힙이 손상된 것 같습니다. 할당 된 포인터를 두 번 이상 삭제하지 않는지 확인하십시오. 배열의 범위를 벗어난 요소에 액세스하지 않습니다. 삭제 된 포인터 등을 액세스하지 못합니다.

관련 문제