Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Ёрик
46 / 46 / 2
Регистрация: 07.01.2009
Сообщений: 298
#1

heap corruption - C++

09.01.2012, 20:23. Просмотров 413. Ответов 0
Метки нет (Все метки)

Здравствуйте, у меня такая проблема. Выскакивает heap corruption, не могу найти где ошибка. Выделяю память тллько в 2-х местах, плюс открываю файл. Главное, что в дебаге не выводится ошибка. Выводится ошибка при выполнении
C++
1
free(rowPermutation);
, а если уберу, то при
C++
1
fclose(wFile);
Вот код, где я выделяю память:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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);
        }
    }
 
}
Вот здесь открываю файлы:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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);
    }
}

Закрываю я сразу почти фацлы, как прочитаю из файла
C++
1
2
fclose(file);
fclose(patternFile);
Здесь меняю порядок строк:
C++
1
2
3
4
5
6
7
8
9
10
11
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);
}
Вjт здесь еще есть место, где меняю порядок стоблцов:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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;
Указатели объявлены как статические, это мне обязательно нужно.
В месте, где я меняю порядок стоблцов создаю новую матрицу, копирую туда все, затем очищаю матрицу sourceMatrix и меняю указатель.
Еще выделяю временную переменную так (в самом начале программы).
C++
1
2
3
4
5
6
7
8
9
10
11
12
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();
// и т.д.
free(rowPermutation);
    fclose(wFile);
Больше нигде не выделяю память, только произвожу операции с массивом(обычные циклы, там ничего нет особенного).
Также заметил, что память вот здесь перетирается. Т.е. копирую одно содержимое, затем сразу при какой-л. операции, выводе изменяются данные. Пробовал создать список(STL C++), тогда все нормально вставляется, выводится.
Вот еще последнее потенциальное место ошибки. Эту сортировку я скопипастил, туда добавил 3 строки и 2 параметра:
template<class T>
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
void qAscendingSortI(T a[], long size, T perm[],int startPos = 0) {
 
 
    long i, j;              // указатели, участвующие в разделении
 
    long lb, ub;        // границы сортируемого в цикле фрагмента
 
    long lbstack[MAXSTACK], ubstack[MAXSTACK]; // стек запросов
    // каждый запрос задается парой значений,
    // а именно: левой(lbstack) и правой(ubstack) 
    // границами промежутка
 
    long stackpos = 1;      // текущая позиция стека
    long ppos;            // середина массива
    T pivot;              // опорный элемент
    T temp; 
 
    lbstack[1] = startPos;
    ubstack[1] = size-1;
 
    do {
 
        // Взять границы lb и ub текущего массива из стека.
 
        lb = lbstack[ stackpos ];
        ub = ubstack[ stackpos ];
        stackpos--;
 
        do {
            // Шаг 1. Разделение по элементу pivot
 
            ppos = ( lb + ub ) >> 1;
            i = lb; j = ub; pivot = a[ppos];
 
            do {
                while ( a[i] < pivot ) i++;
                while ( pivot < a[j] ) j--;
 
                if ( i <= j ) {
                    temp = a[i]; a[i] = a[j]; a[j] = temp; 
                    // вот эти 3 строки я добавил
                                                        temp = perm[i]; 
                                                        perm[i] = perm[j]; 
                                                        perm[j] = temp;
                    i++; j--;
                }
            } while ( i <= j );
 
            // Сейчас указатель i указывает на начало правого подмассива,
            // j - на конец левого (см. иллюстрацию выше), lb ? j ? i ? ub.
            // Возможен случай, когда указатель i или j выходит за границу массива
 
            // Шаги 2, 3. Отправляем большую часть в стек  и двигаем lb,ub
 
            if ( i < ppos ) {     // правая часть больше
 
                if ( i < ub ) {     //  если в ней больше 1 элемента - нужно 
                    stackpos++;       //  сортировать, запрос в стек
                    lbstack[ stackpos ] = i;
                    ubstack[ stackpos ] = ub;
                }
                ub = j;             //  следующая итерация разделения
                //  будет работать с левой частью
 
            } else {            // левая часть больше
 
                if ( j > lb ) { 
                    stackpos++;
                    lbstack[ stackpos ] = lb;
                    ubstack[ stackpos ] = j;
                }
                lb = i;
            }
 
        } while ( lb < ub );        // пока в меньшей части более 1 элемента
 
    } while ( stackpos != 0 );    // пока есть запросы в стеке
}
Можете, пожалуйста подсказать, где ошибка? Вроде, все выделяю как надо. Нигде строковых массивов нет. Но почему-то ошибка выскакивает. И в одном массиве корраптится память.
Кстати, забыл добавить, что IDE - Visual studio 2008, Windows 7 X64, хотя ошибка выскакивает и на x86
0
Миниатюры
heap corruption  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.01.2012, 20:23
Здравствуйте! Я подобрал для вас темы с ответами на вопрос heap corruption (C++):

Heap corruption detected - C++
Heap corruption на строке 93 при первом же выполнении цикла. Из-за чего? #include &lt;locale.h&gt; // для возможности вывода кириллицы ...

Heap corruption detected - C++
Добрый день! Проблема вот в чём: когда выполнение кода доходит до 163 строки, появляется ошибка: &quot; HEAP CORRUPTION DETECTED: after Normal...

Heap corruption detected - C++
Возникает эта ошибка при выполнении функции Strings::Append (строка 81, в меню это пункт 3). Входные данные на всякий случай прикрепила....

Heap corruption detected - C++
Ошибка возникает после отработки программы Заголовочный файл: #pragma once #include&lt;iostream&gt; #include&lt;valarray&gt; ...

Malloc - heap corruption - C++
студия ошибку выдает на double *F=(float*)malloc((N)*sizeof(float)); эта часть кода у меня не хочет работать : ...

heap corruption detected - C++
имеется класс CStr - строка, в нём есть конструктор CStr CStr::CStr(char *s) { length = 0; while (s) length++; str = new...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.01.2012, 20:23
Привет! Вот еще темы с ответами:

Heap Corruption detected ( - C++
что не правильно? запускаю и ошибка вылетает как на предидущей картинке template&lt;typename TT&gt; class Matrix { public:...

Ошибка HEAP CORRUPTION - C++
Добрый вечер, программисты) Не могли бы вы подсказать новичку, каким образом можно обнаружить ошибку (heap corruption). Трассировка...

Heap Corruption Detected - C++
Выдает ошибку HEAP CORRUPTION DETECTED, судя по всему где то ошиблась с распределением памяти Предполагаю, что ошибка прячется в районе...

HEAP CORRUPTION DETECTED - C++
Собственно такую ошибку выдаёт: &quot;HEAP CORRUPTION DETECTED: after Normal block (#220) at 0x001970B8. CRT detected that the application...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru