2012-01-09 3 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» - это файл для записи):

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; 

мне нужно статические указатели, чтобы увидеть их во всей моей программе. Здесь находится другой код, где может существовать ошибка:

Код, приведенный в начале программы.

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 для исправления кучи (просто чтобы узнать, почему массивы отличаются).

Пожалуйста, вы можете найти ошибку? На мой взгляд, я правильно распределяю память.

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

Возможна опечатка в начале вашей программы. Возможно ли, что ваше имя функции 'getMatrix', а не' getMaxtrix'? – Marlon

ответ

2

Какое значение N при вызове malloc() для rowPermutation? Потому что я вижу, что вы получаете значение N из fscanf() после выделения памяти rowPermutation с использованием malloc() для N элементов. Если 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 был инициализирован в первом блоке, а 'malloc()' и 'free()' для 'rowPermutation' был выполнен в последнем блоке. OTOH, у вас появилась возможность использовать valgrind для проверки утечки памяти ?! –

+0

спасибо за комментарий, я этого не сделал. Причина в том, что я использую окна ОС. Есть ли какие-либо профили для Windows, потому что у меня нет UNIX в лаборатории – user565447

0

Даже для лучших программистов распространены ошибки, связанные с повреждением кучи. Вместо того, чтобы идти по очереди, я предлагаю загрузить valgrind с valgrind.org и быстро проследить, как это происходит с этой программой. Valgrdind является бесплатным и поставляется с большинством возможностей Linux.

Коммерческая альтернатива - это обеспечение ++ с сайта parasoft.com.

Код продукта всегда должен быть проверен на предмет проблем с памятью, после чего это хорошая возможность установить инструмент по этой причине.

Что касается вашей программы:

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

Если некоторые из этих указателей NULL вы выхода. Перед вызовом exit (2) вам нужно освободить указатели, которые уже выделены. Каждый раз, когда происходит исключение (указатель == NULL), вам также необходимо позаботиться (бесплатно) о том, что указатели, выделенные до исключения.

+0

Хм, будет ли операционная система делать это вместо меня? Мне нужны эти указатели во всех моих программах, но если есть ошибка, я даю ОС возможность освободить память – user565447

Смежные вопросы