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

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

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

Heap corruption detected - C++

12.09.2013, 17:57. Просмотров 883. Ответов 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 (C++):

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

Heap corruption detected - C++
При попытке очистить память выдает &quot;Heap corruption detected&quot;. Помогите пожалуйста( // labanext.cpp : Defines the entry point for the...

Heap Corruption Detected - C++
Выдает ошибку 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++
Ошибка возникает после отработки программы Заголовочный файл: #pragma once #include&lt;iostream&gt; #include&lt;valarray&gt; ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Убежденный
Системный программист
Эксперт С++
15517 / 7015 / 1110
Регистрация: 02.05.2013
Сообщений: 11,452
Завершенные тесты: 1
12.09.2013, 18:07 #2
Цитата Сообщение от sicknessed Посмотреть сообщение
Получается, что это ошибка происходит при вызове деструктора моего класса.
Нет, это означает, что она обнаруживается при вызове деструктора.
Произойти она может гораздо раньше.
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
12.09.2013, 18:17 #3
где конструктор копий, где оператор =
?
ну просто типичнейшая ошибка.
sicknessed
1 / 1 / 0
Регистрация: 20.03.2013
Сообщений: 12
12.09.2013, 18:57  [ТС] #4
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
где конструктор копий, где оператор =
?
ну просто типичнейшая ошибка.
Зачем они, если я их не использую в своей программе? Или их отсутствие может вызвать ошибку?
coloc
погромист
410 / 246 / 15
Регистрация: 27.08.2012
Сообщений: 550
Завершенные тесты: 1
12.09.2013, 19:01 #5
Цитата Сообщение от sicknessed Посмотреть сообщение
если я их не использую
компилятор их использует неявно. Вообще то есть правило: если есть работа с памятью, значит деструктор, копирующий конструктор и оператор присваивания должны быть.
sicknessed
1 / 1 / 0
Регистрация: 20.03.2013
Сообщений: 12
12.09.2013, 20:22  [ТС] #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
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.09.2013, 20:32 #7
Содержимое файла покажите.
Убежденный
Системный программист
Эксперт С++
15517 / 7015 / 1110
Регистрация: 02.05.2013
Сообщений: 11,452
Завершенные тесты: 1
12.09.2013, 20:34 #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
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
12.09.2013, 20:39 #9
Цитата Сообщение от sicknessed Посмотреть сообщение
for(int i = 0; i <= numberOfColumn; i++)
Почему тут неравенство нестрогое???
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.09.2013, 20:42 #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;
}
sicknessed
1 / 1 / 0
Регистрация: 20.03.2013
Сообщений: 12
12.09.2013, 21:29  [ТС] #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;
}
Спасибо большое. Заработало!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.09.2013, 21:29
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
12.09.2013, 21:29
Ответ Создать тему
Опции темы

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