2012-01-09 1 views
1

나는 힙 손상이 있고 이유를 찾을 수 없습니다. 제발, 도와 줄 수 있니? 나는 내 마음에 오류가있는 코드 조각이있다. 힙 손상이 여기에 생성된다 (아래 설명 참조)힙 손상. C

free(rowPermutation); 
fclose(wFile); 

그래서, 메모리 할당은 여기에 있습니다 :

static int N = 2,**orderOfRows, *columnsPermutation,*tmpRowPermutation,*resultPermutation, 
    *u,*v,**sourceMatrix,**patternMatrix,**auxMatrix1,*incidence,*perm; 

static FILE *wFile,*file,*patternFile; 

void allocate2dMemory() { 

    int i = 0; 

    sourceMatrix = (int**) malloc(N * sizeof(int *)); 
    auxMatrix1= (int**) malloc(N * sizeof(int *)); 
    orderOfRows = (int**) malloc(N * sizeof(int*)); 
    patternMatrix = (int**) malloc(N * sizeof(int*)); 
    incidence = (int*) malloc(N * sizeof(int)); 
    columnsPermutation = (int*) malloc(N * sizeof(int)); 
    tmpRowPermutation = (int*) malloc(N * sizeof(int)); 
    resultPermutation = (int*) malloc(N * sizeof(int)); 
    perm = (int*)malloc(N * sizeof(int)); 

    u = (int*) malloc(N * sizeof(int)); 
    v = (int*) malloc(N * sizeof(int)); 

    if ((sourceMatrix == NULL) || (auxMatrix1 == NULL) || (incidence == NULL) || (orderOfRows == NULL) || 
      (columnsPermutation == NULL) || (tmpRowPermutation == NULL) || (u == NULL) || (v == NULL) || (resultPermutation == NULL)) { 
      fprintf(stderr, "out of memory\n"); 
      exit(2); 
    } 


    for (i = 0; i < N; i++) { 
      sourceMatrix[i] = (int*) malloc(N * sizeof(int)); 
      auxMatrix1[i] = (int*) malloc(N * sizeof(int)); 
      patternMatrix[i] = (int*) malloc(N * sizeof(int)); 
      incidence[i] = 0; 
      if ((sourceMatrix[i] == NULL) || (auxMatrix1[i] == NULL) || (patternMatrix[i] == NULL)) { 
          fprintf(stderr, "out of memory\n"); 
          exit(2); 
      } 
    } 

}

파일 열기 : 그럼

void openFile(char* filename) { 
    if ((file = fopen(filename, "r")) == NULL) { 
      perror("Open error"); 
      printf("\nPress any key for exit\n\n"); 
      getch(); 
      exit(1); 
    } 


    if ((patternFile = fopen("pattern.dat", "r")) == NULL) { 
      perror("Open error"); 
      printf("\nPress any key for exit\n\n"); 
      getch(); 
      exit(1); 
    } 

    if ((wFile = fopen("out.txt", "w")) == NULL) { 
      perror("Open error"); 
      printf("\nPress any key for exit\n\n"); 
      getch(); 
      exit(1); 
    } 

나는 그들 중 일부를 닫는다. ("wFile"은 글쓰기를위한 파일이다) :

012 3,516,
fclose(file); 
    fclose(patternFile); 

변경 행 주문 : 열

void changeRowOrder(int *computation,int **matr) { 

    fprintf(wFile,"Make row permutation\n"); 

    int i,j; 

    for (i = 0; i < N; ++i) { 
      orderOfRows[computation[i]] = matr[i]; 
    } 
    fputs("\n",wFile); 
} 

변경 순서 : 내 모든 프로그램에 있으며이 프로그램을보기 위해 정적 포인터를 필요

int **destMatrix = (int**) malloc(N * sizeof(int *)); 

    if ((destMatrix == NULL)) { 
      fprintf(stderr, "out of memory\n"); 
      exit(2); 
    } 

    for (i = 0; i < N; i++) { 
      destMatrix[i] = (int*) malloc(N * sizeof(int)); 

      if (destMatrix[i] == NULL) { 
        fprintf(stderr, "out of memory\n"); 
        exit(2); 
      } 
    } 

    for(i = 0; i < N; ++i) { 
      // save permutation 
      resultPermutation[perm[i]] = i; 
      for(j = 0; j < N; ++j) { 
        destMatrix[i][j] = orderOfRows[i][perm[j]]; 
      } 
    } 

    fprintf(wFile,"Now result permutation is: \n"); 
    printArray(resultPermutation); 

    for(i = 0; i < N; ++i) { 
      free(sourceMatrix[i]); 
    } 
    free(sourceMatrix); 

    sourceMatrix = destMatrix; 

. 여기에 오류가 존재할 수있는 다른 코드가 있습니다.

아래 코드는 programm 시작 부분에 있습니다.

int res,i,j; 
    char c[25],f[25],g; 

    int *rowPermutation = (int*)malloc(N*sizeof(int)); 

    openFile("inb.dat"); 
    fscanf(file,"%s %s %d %d",&c,&f,&N,&i); 
    allocate2dMemory(); 
    getMaxtrix(); 
    // and so on ... 
    free(rowPermutation); 
    fclose(wFile); 

내 프로그램의 다른 위치에 메모리를 할당하지 않습니다. "columnsPermutation"배열에서 메모리가 손상되었음을 확인했습니다. 먼저 요소를 복사 한 다음 요소가 변경되기 시작합니다. 배열을 왜 다른지 알기 위해 STL 컨테이너를 사용하여 힙 손상을 해결할 때 알아 차 렸습니다.

제발, 오류를 찾을 수 있습니까? 내 마음에, 나는 기억을 올바르게 할당한다. 당신이 rowPermutation에 대한 malloc()를 호출 할 때

enter image description here

+0

출력시 정확한 오류를 알려주시겠습니까? GDB를 사용하여 무엇인가를 찾으려고 했습니까? 또한 스 니펫이 아닌 전체 기능을 게시 할 수 있습니까? – samoz

+3

접두사 주석 : [선호] (http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc)'x = malloc (N * sizeof (* x))' 'x = (T *) malloc (N * sizeof (T))'로 변환한다. –

+0

프로그램 시작 부분에 오타가있을 수 있습니다. 함수 이름이'getMaxtrix'가 아니라'getMatrix' 일 가능성이 있습니까? – Marlon

답변

2

N의 가치는 무엇인가? 왜냐하면 의 값을 fscanf()에서 rowPermutation에 할당 한 후 N 요소에 대해 malloc()을 사용하고 있습니다. N이 제대로 초기화되지 않으면 가비지 값이 포함될 수 있습니다.

int *rowPermutation = (int*)malloc(N*sizeof(int)); 
// What is the value of N when executing the above code? 

openFile("inb.dat"); 
fscanf(file,"%s %s %d %d",&c,&f,&N,&i); 
// N is obtained after malloc'ing memory to rowPermutation 

OTOH, 메모리 누수 문제를 확인하기 위해 valgrind 같은 도구를 사용하는 것이 좋다.

+0

코드를주의 깊게 보시고, 정적 N = 2; – user565447

+0

@ user565447 사과. 나는 그것을 놓쳤을지도 모른다. 코드는 여러 개의 덩어리로 나뉘어져 있습니다. N은 첫 번째 블록에서 초기화되었고 'rowPermutation'에 대한 malloc() 및 free()는 마지막 블록에서 완료되었습니다. OTOH, valgrind를 사용하여 메모리 누수를 확인할 수있는 기회를 얻었습니까? 덧글을 주셔서 감사합니다 –

+0

, 나는 그것을하지 않았습니다. 그 이유는 OS 윈도우를 사용한다는 것입니다. 실험실에 UNIX가 없기 때문에 윈도우 용 프로파일이 있습니까? – user565447

0

힙 손상과 관련된 가장 좋은 프로그래머 실수조차도 일반적입니다. 한 줄씩가는 대신 valgrind.org에서 valgrind를 다운로드하고 해당 프로그램과 함께 제공되는 방법을 빠르게 따르도록 제안합니다. Valgrdind는 무료이며 Linux의 가장 많은 맛을 제공합니다.

상업적 대안은 parasoft.com의 insure ++입니다.

생산 코드는 항상 메모리 문제에 대해 검사해야하며, 그 이후로는 그 이유 때문에 도구를 설치할 좋은 기회입니다.프로그램에 관한

: 그 포인터의 일부는 당신이 종료하는 NULL 인 경우

if ((sourceMatrix[i] == NULL) || (auxMatrix1[i] == NULL) || (patternMatrix[i] == NULL)) { 

. exit (2)를 호출하기 전에 이미 할당 된 포인터를 해제해야합니다. 예외 (포인터 == NULL)가 발생할 때마다 예외 이전에 할당 된 포인터도 처리해야합니다 (무료).

+0

흠, 운영체제가 나 대신 그것을할까요? 내 모든 programm에이 포인터가 필요하지만 오류가있는 경우 OS에 메모리를 확보 할 수있는 기회를 제공합니다. – user565447