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

heap corruption - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Строчки http://www.cyberforum.ru/cpp-beginners/thread425191.html
Строки( цепочки цифр) создаются по следующему правилу. Первая строка состоит из одного символа- цифры "1". Каждая из последующих цепочек создаётся такими действиями: в очередную строку записывается сначала номер строки (без ведущих нулей), а затем два раза приписывается предыдущая строка. Вот первые 4 строки, созданные по этому правилу: 1. 1 2. 211 3. 3211211 4....
C++ вычисление суммы Вычислить сумму 1-1\2+1\3-…+(-1)sqr(n+1)*(1\n) #include <stdafx.h> #include <cstdlib> #include <iostream> #include "cmath" using namespace std; class summa { public: http://www.cyberforum.ru/cpp-beginners/thread425179.html
C++ Рекурсия: сложение двух чисел
Написать рекурсивную программу сложения двух чисел........ помогите срочно нужно
C++ Массив указателей
Помогите, пожалуйста, разобраться в чем ошибка и обьясните, что тут не так. Спасибо. (программа запускается, но зависает) #include <iostream> using namespace std; void B(int*** x){ x=1; } void A(int*** x){
C++ Наименьшая система счисления (acmp.ru) http://www.cyberforum.ru/cpp-beginners/thread425170.html
Задача На своей машине какие только тесты не вводил, все проходит. А на ********, даже первый не идет. #include <fstream> #include <string> int main(){ std::fstream o("INPUT.TXT"),u("OUTPUT.TXT", std::ios::out); std::string a, s = "0123456789ABCDEFGHIKLMNOPQRSTVWXYZ"; int c = 0, m;
C++ Определить, сколько точек попадает в кольцо с внутренним радиусом R1 и внешним R2 Люди помогите с задачкой: В ПК вводятся по очереди координаты n точек. Определить, сколько из них попадает в кольцо с внутренним радиусом R1 и внешним R2. подробнее

Показать сообщение отдельно
Ёрик
45 / 45 / 2
Регистрация: 07.01.2009
Сообщений: 298
09.01.2012, 20:23     heap corruption
Здравствуйте, у меня такая проблема. Выскакивает 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
Миниатюры
heap corruption  
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 02:06. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru