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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.92
bgm313
12 / 12 / 2
Регистрация: 27.07.2012
Сообщений: 208
#1

Ошибка о повреждение кучи - C++

28.08.2012, 15:17. Просмотров 1601. Ответов 5
Метки нет (Все метки)

Вот переделал программу со строками, с использованием классов.
Почему-то опять возникает ошибка о повреждение кучи. Не могу понять где она происходит. Уже всё пересмотрел. Если нетрудно посмотрить в чём может быть ошибка:

Вот код

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
//main.cpp
#include "MyString.h"
#include <iostream>
using namespace std;
 
//выбор операции над строками
char ExSelect(void);
 
//чтение строки с максимальной длиной len
bool Read(char *str,int max_len);
 
int main(void){
    char ch;
    char str[MAX_LEN];
    MyString *s1, *s2;
    
    setlocale(LC_ALL,"Rus");
 
    for(;;){
        system("cls");
 
        //выберем операцию над строками
        ch = ExSelect();
        if(ch == '0') break;
        
        cout << '\n';
 
        do{
            cout << "Введите строку 1: ";
        }while(!Read(str,MAX_LEN));
 
        s1 = new MyString(str);
 
        switch(ch){
        case'1':
            do{
                cout << "Введите строку 2: ";
            }while(!Read(str,MAX_LEN));
 
            s2 = new MyString(str);
                    
            cout << "Результат сравнения Compare: " << 
                s1->Compare(*s2) << '\n';   
            cout << "Результат сравнения strcmp: " <<
                strcmp(s1->GetStr(),s2->GetStr()) << '\n'; 
            
            delete s1;
            delete s2;
            
            break;
        case'2':
             do{
                cout << "Введите строку 2: ";
            }while(!Read(str,MAX_LEN));
 
            s2 = new MyString(str);
                    
            cout << "Результат сложения Concat: " << *s1 + *s2 << '\n';
            cout << "Результат сложения strcat:" <<
                strcat(s1->GetStr(),s2->GetStr()) << '\n'; 
            
            delete s1;
            delete s2;
            
            break;
        case'3':
            cout << "длина строки Length: " << s1->Length() << '\n';
            cout << "длина строки strlen: " << strlen(s1->GetStr()) << '\n';
            delete s1;
            break;
        case'4':
             do{
                cout << "Введите строку2: ";
            }while(!Read(str,MAX_LEN));
 
            s2 = new MyString(str);
 
            cout << "строка: " << s1->GetStr() << '\n';
            cout << "подстрока: " << s2->GetStr() << '\n';
            cout << "количество подстрок: " << s1->CalcSub(*s2) << '\n';
            
            delete s1;
            delete s2;
            break;
        }
        cout << '\n';
        system("pause");
    }
    return 0;
}
 
char ExSelect(void){
    char ch;
    
    cout << "Меню:\n"
         << " 1.Сравнение строк.\n"
         << " 2.Конкатенация строк.\n"
         << " 3.Длина строки.\n"
         << " 4.Количество подстрок.\n";
    do{
        cout << "Сделайте выбор(0-выход): ";
        fflush(stdin);
    }while(scanf("%c",&ch)!=1 || cin.rdbuf()->in_avail()!=1 ||
        ch < '0' || ch > '4');
    return ch;
}
 
bool Read(char *str,int max_len){
    int ch;
    int i = 0;
    
    fflush(stdin);
    
    for(;;){
        ch = getchar();
        if(ch == '\n'){
            ungetc(ch,stdin);
            break;
        }
 
        str[i++] = ch;
        if(i == max_len - 1) break;
 
    }
    str[i] = 0;
    
    if(getchar() == '\n') return true;
    else{
        cout << "Максимальная длина строки: " << max_len -1;
        return false;
    }
}
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
//MyString.cpp
#include "MyString.h"
#include <iostream>
using namespace std;
 
 
MyString::MyString(char *ptr){
    int n = strlen(ptr);
    
    if(n >= MAX_LEN)
        cout << "Максимальная длина строки: " << MAX_LEN - 1 << '\n';
    else{
        str = new char[n + 1];
        strcpy(str,ptr);
    }
}
    
MyString::MyString(int size){
    if(size >= MAX_LEN){
        cout << "Максимальная длина строки: " << MAX_LEN-1 << '\n'; 
    }else{
        str = new char[size];
        for(int i=0; i<=size;i++)
            str[i] = 0;
    }
}
    
MyString::MyString(const MyString &o){
    str = new char[strlen(o.str) + 1];
    strcpy(str,o.str);
}
 
MyString::~MyString(void){
        delete []str;
}
 
MyString::MyString(void){
    char *str = new char[1];
    *str = 0;
}
 
MyString MyString::operator=(MyString &ob2){
    delete []str;
    str = new char[strlen(ob2.str) + 1];
    strcpy(str,ob2.str);
    return *this;
}
 
int MyString::Length(void){
    int len = 0;
    while(str[len]) len++;
    
    return len;
}
 
int MyString::Compare(const MyString &ob2){
    int i = 0;
 
    while(str[i] == ob2.str[i]){
        if(!str[i]) return 0;
        i++;
    }
    if((str[i] - ob2.str[i]) < 0) return -1;
    return 1;
}
 
MyString MyString::operator+(const MyString &ob2){
    char *temp = new char[strlen(str) + strlen(ob2.str) + 1];
    strcpy(temp,str);
    strcat(temp,ob2.str);
    
    MyString result(temp);
    delete []temp;
    return result;
}
 
int SearchSub(const char *str, const char *substr){
    int result = 0;
    
    while(strstr(str,substr)){
        result++;
        str = strstr(str,substr) + strlen(substr) - 1;
    }
    
    return result;
}
 
int MyString::CalcSub(const MyString &ob2){
    return SearchSub(str,ob2.str);
}
 
ostream & operator << (ostream &stream,const MyString &ob){
    stream << ob.str;
    return stream;
}
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
//  MyString.h
#pragma once
#include <iostream>
using namespace std;
 
#define MAX_LEN 101
 
class MyString{
    char *str;
public:
    MyString(void);
    MyString(char *str);
    MyString(int size);
        
    MyString(const MyString &o);
    
    ~MyString(void);
    
    MyString operator=(MyString &ob2);
    MyString operator+(const MyString &ob2);
    
    int Length(void);
    int Compare(const MyString &ob2);
    int CalcSub(const MyString &ob2);
    
    char * GetStr(void) { return str; }
 
    friend ostream & operator << (ostream &stream,const MyString &ob);
};
 
ostream & operator << (ostream &stream,const MyString &ob);
int SearchSub(const char *str, const char *substr);
Добавлено через 45 секунд
Ошибка возникает при выполнение пункта 2.

Добавлено через 16 минут
Нашёл. Если кому интересно ошибка в функции strcar в main.

Добавлено через 1 минуту
Посдкажите, как привести программу к человеческому виду. Что исправить?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.08.2012, 15:17     Ошибка о повреждение кучи
Посмотрите здесь:

МНК, повреждение кучи C++
C++ Повреждение кучи
Повреждение кучи C++
Ошибка кучи C++
C++ Повреждение кучи
Ошибка при "сборе мусора" . Повреждение кучи C++
C++ Ошибка кучи
Повреждение кучи C++
C++ Точка останова(повреждение кучи)
C++ Повреждение кучи при создании нейросети с количеством слоев больше 51
C++ Получать различные начала кучи при создании кучи внутри цикла
C++ Ошибка о выходе за границу памяти кучи

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
28.08.2012, 16:42     Ошибка о повреждение кучи #2
Цитата Сообщение от bgm313 Посмотреть сообщение
Нашёл. Если кому интересно ошибка в функции strcar в main.
что за ошибка,чем вызвана?
bgm313
12 / 12 / 2
Регистрация: 27.07.2012
Сообщений: 208
28.08.2012, 18:11  [ТС]     Ошибка о повреждение кучи #3
Функция strcat изменяет 1 операнд, дописывая к нему второй.
alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
28.08.2012, 18:33     Ошибка о повреждение кучи #4
Цитата Сообщение от bgm313 Посмотреть сообщение
Функция strcat изменяет 1 операнд, дописывая к нему второй.
вообще-то,она и должна это делать
bgm313
12 / 12 / 2
Регистрация: 27.07.2012
Сообщений: 208
28.08.2012, 21:12  [ТС]     Ошибка о повреждение кучи #5
Она изменяет 1 операнд, под который выделена динамическая память без соотв. преобразований.
alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
29.08.2012, 07:27     Ошибка о повреждение кучи #6
немного теории
Функция strcat присоединяет свой второй аргумент (строку) к первому
аргументу — массиву символов, содержащему строку. Первый символ второго
аргумента замещает нулевой символ ('\0'), который завершал строку в первом
аргументе. Программист должен быть уверен, что массив, используемый для
хранения первой строки, достаточно велик для того, чтобы хранить
комбинацию первой строки, второй строки и завершающего нулевого символа
(скопированного из второй строки).
Yandex
Объявления
29.08.2012, 07:27     Ошибка о повреждение кучи
Ответ Создать тему
Опции темы

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