2

짧은 이야기 : 힙에서 런타임에 할당되는 큰 3D 배열을 수정하려고합니다. 배열을 수정하는 함수 인 vcross이 파괴되지 않는 메모리를 생성한다고 생각합니다.큰 동적 크기의 3D 배열 수정 mex/C++


긴 이야기 : 내가 큰 3D 이중 배열을 (~ 126000x3x3 또는 8.6MB에 대해) 나는 몇 가지 작업을 실행해야합니다. 이 배열의 첫 번째 차원이 컴파일 시간에 얼마나 큰지 알지 못하므로 newdelete 연산을 사용하여 힙에 메모리를 할당합니다.

이 배열에 값을 저장하려고하면 분할 위반이 발생합니다. 이것은 배열에 값을 저장하는 동안 낭비되는 어딘가에서 메모리를 만들고 결국 힙을 채 웁니다.

코드는 정상적으로 컴파일되지만 실행시 seg 위반이 발생합니다.

static void inpolyh(
    double (*f)[3],//pointer to array[3], treated as 2D array where I don't know the first dimension until run-time. 
    double (*v)[3], 
    double (*p)[3], 
    size_t numF, 
    size_t numP) 
{ 

    /*Calculate the baseNormals*/ 
    //allocate memory on the heap 
    double (*baseNormals)[3] = NULL;//pointer to an array[3] 
    if (!(baseNormals = new double[numF][3])) { out_of_memory(); } 

    //store the vector cross products in each array[3] of baseNormals 
    for (int i=0; i<numF; i++) { 
     vcross(baseNormals[i], 
      v[(int)f[i][0]], 
      v[(int)f[i][1]], 
      v[(int)f[i][2]]); 
     //THIS WORKS 
    } 

    /*Calculate face normals of tetrahedron*/ 
    //allocate memory on the heap (THIS WORKS) 
    double (*faceNormals)[3][3] = NULL; //pointer to an array[3] of arrays[3] 
    if (!(faceNormals = new double[numP][3][3])) { out_of_memory(); } 

    //store vector cross products into each array[3] of faceNormals 
    for (int i=0; i<numP; i++) { 
     for (int j=0; j<3; j++) { 
      vcross(faceNormals[i][j], 
       p[i], 
       v[ (int) f[i][j] ], 
       v[ (int) f[i][ (j + 1) % 3 ] ]); 
      //SEG VIOLATION at i=37560 
     } 
    } 

    delete [] baseNormals; 
    delete [] faceNormals; 
} 

이 함수는 결코 파괴되지 않는 어딘가에 메모리를 생성한다고 생각합니다. 벡터 교차 곱 함수는 4 개의 array [3] 매개 변수를 받아들이고 참조로 전달되는 첫 번째 입력 매개 변수에 일부 값을 지정합니다. 문제가 있습니다

static void vcross(
    double (&n)[3], 
    double a[3], 
    double b[3], 
    double c[3]) 
{ 
    n[0] = b[1] * c[2] - a[1] * c[2] + a[1] * b[2] - b[2] 
       * c[1] + a[2] * c[1] - a[2] * b[1]; 
    n[1] = b[2] * c[0] - a[2] * c[0] + a[2] * b[0] - b[0] 
       * c[2] + a[0] * c[2] - a[0] * b[2]; 
    n[2] = b[0] * c[1] - a[0] * c[1] + a[0] * b[1] - b[1] 
       * c[0] + a[1] * c[0] - a[1] * b[0]; 
    return; 
} 

기타 세부 사항은 :

  • 이 MATLAB에서 실행하는 MEX 함수가 될하기위한 것입니다.
  • 기본 인코딩 : 창-1252
  • MATLAB 루트 : C : \ 프로그램 파일 \ MATLAB \ R2012b
  • MATLAB 버전 : 8.0.0.783 (R2012b)
  • 운영 체제 : 마이크로 소프트 윈도우 7
  • 프로세서 ID : 86 가족 (6) 모델 (58)이 9 스테핑, GenuineIntel는
  • 가상 머신 : 썬 마이크로 시스템즈 자바 핫스팟 (TM) 64 비트 서버 VM 혼합 모드
  • 윈도우 시스템에 자바 1.6.0_17-B04 : 버전 6.1 (7601 빌드 : 서비스 팩 1)
+0

보이지 않는 잉크에'vcross()'가 할당되어 있습니까? 왜냐하면 볼 수 없기 때문입니다. – WhozCraig

+0

'numP' 루프에서 v [(int) f [i] [(j + 1) % 3]]의'f'가'numP'보다 크거나 같은지 확인하십시오. 나는 당신의 코드에서'assert (numF> = numP);'또는 유사한 것을 추가 할 것을 제안한다. – ilent2

+0

double (캐스팅 된 int) 인덱스로 사용하는 것이 이상하게 보입니다. – Jarod42

답변

0

(int)f[i][j]은 항상 [0, < 차원 v] 범위에 있습니까? 가장 먼저 루프가 실행될 때 (int)f[i][j]의 값을 출력하는 것입니다. 아니면 디버거를 작동시켜 충돌 순간의 값을 볼 수 있습니다.

+0

나는 f와 v 배열을 따로 생성한다. 이것은 f에 주어진 인덱스가 v에있는 엔트리에 해당한다고 주장한다. – joshkarges