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

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

Войти
Регистрация
Восстановить пароль
 
sicknessed
1 / 1 / 0
Регистрация: 20.03.2013
Сообщений: 12
#1

Heap corruption detected - C++

12.09.2013, 17:57. Просмотров 862. Ответов 10
Метки нет (Все метки)

Добрый день! Проблема вот в чём: когда выполнение кода доходит до 163 строки, появляется ошибка: " HEAP CORRUPTION DETECTED: after Normal block (#752) at 0x0038A5D8. CRT detected that the application wrote to memory after end of heap buffer". Получается, что это ошибка происходит при вызове деструктора моего класса. Но, вот, в чём именно там ошибка, я, увы, разобраться не могу.
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
#include <iostream>
#include <string>
#include <fstream>
#include <conio.h>
 
class Matr {
    public:
        Matr(const int row, const int column);
        ~Matr();
        void printMatr(int count);
        bool addStr(char* str, int number);
        void setNumberOfColumn(int i);
        int getNumberOfColumn();
        int getNumberOfRow();
        void sortBubble();
        void sortSelection();
        char** body;
    private:
        int numberOfColumn;
        int numberOfRow;
        static int numberOfBubbleCompare;
        static int numberOfBubbleChange;
        static int numberOfSelectionCompare;
        static int numberOfSelectionChange;
};
 
Matr::Matr(const int row = 1, const int column = 0){
    body = new char*[row];
    for(int i = 0; i < column; i++){
        body[i] = new char[column];
    }
    numberOfColumn = column;
    numberOfRow = row;
}
 
Matr::~Matr(){
    for(int i = 0; i < numberOfRow; i++){
        delete body[i];
    }
    delete[] body;
}
 
void Matr::setNumberOfColumn(int i){
    numberOfColumn = i;
}
 
int Matr::getNumberOfColumn(){
    return numberOfColumn;
}
 
int Matr::getNumberOfRow(){
    return numberOfRow;
}
 
bool Matr::addStr(char* str, int number){
    using namespace std;
    /*if (sizeof(str)/sizeof(char*) != numberOfColumn){
        cout << "Неверное количество столбцов! Это не может быть матрицей!" << endl;
        return false;
    }*/
    for(int i = 0; i <= numberOfColumn; i++){
        this->body[number][i] = str[i];
    }
    return true;
}
 
void Matr::printMatr(int count){
    using namespace std;
    for(int i = 0; i <= count; i++){
        for(int k = 0; k < numberOfColumn; k++){
            cout << body[i][k] << " ";
        }
        cout << endl;
    }
}
 
void Matr::sortBubble(){
    for(int j = 0; j < numberOfRow; j++){
        for(int i = 1; i < numberOfColumn; ++i){
            for(int k = numberOfColumn-1; k >= i; --k) { 
                if(body[j][k-1] > body[j][k]) { 
                    char t = body[j][k-1]; 
                    body[j][k-1] = body[j][k]; 
                    body[j][k] = t; 
                    numberOfBubbleChange++;
                }
                numberOfBubbleCompare++;
            } 
        }
    }
}
 
void Matr::sortSelection(){
    for(int k = 0; k < numberOfRow; k++){
        for(int i = 0; i < numberOfColumn-1; ++i) { 
            bool flag = false; 
            int c = i; 
            char t = body[k][i]; 
            for(int b = i+1; b < numberOfColumn; ++b) { 
                if(body[k][b] < t) { 
                    c = b; 
                    t = body[k][b]; 
                    flag = true; 
                }
                numberOfSelectionCompare++;
            } 
            if(flag) { 
                body[k][c] = body[k][i]; 
                body[k][i] = t; 
                numberOfSelectionChange;
            } 
        } 
    }
}
 
 
int Matr::numberOfBubbleCompare = 0;
int Matr::numberOfBubbleChange = 0;
int Matr::numberOfSelectionCompare = 0;
int Matr::numberOfSelectionChange = 0;
 
void deleteChar(char *string, int number){
    for(int k = number; k < strlen(string); k++){
        string[k] = string[k+1];
    }
}
 
int deleteSpaces(char* str){
    int i = 0;
    while(str[i] != '\n'){
        if(isspace(str[i])){
            deleteChar(str, i);
        }else{
            i++;
        }
    }
    return i;
}
int main(){
    using namespace std;
    setlocale(0,"");
    bool flagOfRepeat = false;
    do{
        cout << "Введите имя файла, из которого нужно считать матрицу: ";
        string nameOfFile;
        cin >> nameOfFile;
        ifstream f(nameOfFile);
        if(f && !f.eof()){
            char* p = new char[255];
            f.getline(p, 255);
            p[strlen(p)] = '\n';
            Matr matr(10,deleteSpaces(p));                  //Создание матрицы и удаление из р пробелов
            int countOfRow = 0;
            matr.addStr(p, countOfRow);
            while(!f.eof()){
                countOfRow++;
                f.getline(p,255);
                p[strlen(p)] = '\n';
                deleteSpaces(p);
                matr.addStr(p, countOfRow);
            }
            matr.printMatr(countOfRow);         
        }else{  
            cout << "Ошибка открытия файла!" << endl;
        }
        cout << "Хотите считать данные из другого файла? Если да, введите 1, нет - любую другую клавишу: ";
        char i;
        cin >> i;
        if(i != '1'){
            flagOfRepeat = false;
        }
    }while(flagOfRepeat);
    _getch();
return 0;
}
Буду благодарен за помощь!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.09.2013, 17:57     Heap corruption detected
Посмотрите здесь:

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

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

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

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

ошибка Heap corruption detected - C++
Доброго времени суток! подскажите пожалуйста что я не так сделал. При запуске программы вылетает ошибка в строке 34 // d.cpp: главный...

Heap corruption detected after normal block - C++
выкидывает ошибку при попытке освободить память массива, делаю так: char **Items; ... free(Items);

HEAP CORRUPTION DETECTED - не понятно почему - C++
Помогите пожалуйста. Есть такой код: double e; char* w; /////// POINT 1 string q; size_t pos; string...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Убежденный
Системный программист
Эксперт С++
15239 / 6871 / 1088
Регистрация: 02.05.2013
Сообщений: 11,253
Завершенные тесты: 1
12.09.2013, 18:07     Heap corruption detected #2
Цитата Сообщение от sicknessed Посмотреть сообщение
Получается, что это ошибка происходит при вызове деструктора моего класса.
Нет, это означает, что она обнаруживается при вызове деструктора.
Произойти она может гораздо раньше.
Kuzia domovenok
1889 / 1744 / 117
Регистрация: 25.03.2012
Сообщений: 5,922
Записей в блоге: 1
12.09.2013, 18:17     Heap corruption detected #3
где конструктор копий, где оператор =
?
ну просто типичнейшая ошибка.
sicknessed
1 / 1 / 0
Регистрация: 20.03.2013
Сообщений: 12
12.09.2013, 18:57  [ТС]     Heap corruption detected #4
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
где конструктор копий, где оператор =
?
ну просто типичнейшая ошибка.
Зачем они, если я их не использую в своей программе? Или их отсутствие может вызвать ошибку?
coloc
погромист
409 / 245 / 15
Регистрация: 27.08.2012
Сообщений: 550
Завершенные тесты: 1
12.09.2013, 19:01     Heap corruption detected #5
Цитата Сообщение от sicknessed Посмотреть сообщение
если я их не использую
компилятор их использует неявно. Вообще то есть правило: если есть работа с памятью, значит деструктор, копирующий конструктор и оператор присваивания должны быть.
sicknessed
1 / 1 / 0
Регистрация: 20.03.2013
Сообщений: 12
12.09.2013, 20:22  [ТС]     Heap corruption detected #6
Дописал и конструктор копий, и присваивание:
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
Matr::Matr(const Matr &M){
    numberOfColumn = M.numberOfColumn;
    numberOfRow = M.numberOfRow;
    body = new char*[numberOfRow];
    for(int i = 0; i < numberOfRow; i++){
        body[i] = new char[numberOfColumn];
    }
    for(int i = 0; i < numberOfRow; i++){
        for(int k = 0; k < numberOfColumn; k++){
            body[i][k] = M.body[i][k];
        }
    }
}
 
const Matr& Matr::operator = (const Matr& M){
    using namespace std;
    if(numberOfRow == M.numberOfRow && numberOfColumn == M.numberOfColumn){
        for(int i = 0; i < numberOfRow; i++){
            for(int k = 0; k < numberOfColumn; k++){
                body[i][k] = M.body[i][k];
            }
        }
        return *this;
    }else{
        cout << "Невозможно выполнить присваивание! Размеры не совпадают!" << endl; 
    }
}
Но от этого ошибка не исчезла.
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.09.2013, 20:32     Heap corruption detected #7
Содержимое файла покажите.
Убежденный
Системный программист
Эксперт С++
15239 / 6871 / 1088
Регистрация: 02.05.2013
Сообщений: 11,253
Завершенные тесты: 1
12.09.2013, 20:34     Heap corruption detected #8
sicknessed, учитесь сводить задачу к минимально воспроизводимому примеру:
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
#include <iostream>
 
 
 
class Matr {
    public:
        Matr(const int row, const int column);
        ~Matr();
        char** body;
    private:
        int numberOfColumn;
        int numberOfRow;
};
 
 
 
Matr::Matr(const int row = 1, const int column = 0){
    body = new char*[row];
    for(int i = 0; i < column; i++){
        body[i] = new char[column];
    }
    numberOfColumn = column;
    numberOfRow = row;
}
 
 
 
Matr::~Matr(){
    for(int i = 0; i < numberOfRow; i++){
        delete body[i];
    }
    delete[] body;
}
 
 
 
 
int main(){
    Matr matr(10,5);
return 0;
}
Вылетает с segmentation fault.
По-прежнему нет идей, где искать ошибку ?
Kuzia domovenok
1889 / 1744 / 117
Регистрация: 25.03.2012
Сообщений: 5,922
Записей в блоге: 1
12.09.2013, 20:39     Heap corruption detected #9
Цитата Сообщение от sicknessed Посмотреть сообщение
for(int i = 0; i <= numberOfColumn; i++)
Почему тут неравенство нестрогое???
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.09.2013, 20:42     Heap corruption detected #10
C++
1
2
3
4
5
6
7
8
Matr::Matr(const int row = 1, const int column = 0){
    body = new char*[row];
    for(int i = 0; i < column; i++){ // !!! i < row
        body[i] = new char[column];
    }
    numberOfColumn = column;
    numberOfRow = row;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.09.2013, 21:29     Heap corruption detected
Еще ссылки по теме:

HEAP CORRUPTION DETECTED не могу найти ошибку - C++
код весь прорабатывает, но в конце выдаёт HEAP CORRUPTION через дебаг прогнал но так и не нашел ничего может вы подскажите на что...

Heap corruption detected after normal block #980 - C++
Здравствуйте! Нужна ваша помощь. Как я понимаю, ошибка возникает во время работы функции Deriv(), но мне не понятно почему она возникает....

Heap corruption detected: after normal block (#153) at 0x00345730 - C++
#ifndef COW_H__ #define COW_H__ class Cow { char name; char *hobby; double weight; static int num;// chislo obektov

Heap corruption detected при удалении динамического массива - C++
mystring.cpp - здесь происходит ошибка в функции MyString::operator на строке delete s. В чем тут может быть дело? #include &quot;mystring.h&quot; ...

Heap corruption detected при добавлении нового элемента в однонаправленный список - C++
Метод add на вход получает строку, затем ищет в списке такой элемент и добавляет новое звено списка. При добавлении нового элемента...


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

Или воспользуйтесь поиском по форуму:
sicknessed
1 / 1 / 0
Регистрация: 20.03.2013
Сообщений: 12
12.09.2013, 21:29  [ТС]     Heap corruption detected #11
Цитата Сообщение от alsav22 Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
Matr::Matr(const int row = 1, const int column = 0){
    body = new char*[row];
    for(int i = 0; i < column; i++){ // !!! i < row
        body[i] = new char[column];
    }
    numberOfColumn = column;
    numberOfRow = row;
}
Спасибо большое. Заработало!
Yandex
Объявления
12.09.2013, 21:29     Heap corruption detected
Ответ Создать тему
Опции темы

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