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

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

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

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

28.08.2012, 15:17. Просмотров 1749. Ответов 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++
После выполнения программы выдаёт ошибку Debug Assertion Failed Помогите найти и исправить место из-за которого ошибка, я так понимаю она...

Повреждение кучи - C++
Есть код #include &lt;iostream&gt; using namespace std; struct STUDENT { char NAME; int GROUP; int SES; };

Повреждение кучи - C++
Приветствую! Сделал, казалось бы, простую программу, но у меня возникает ошибка на самом ровном месте: void print(node** graph, int V) ...

Повреждение кучи - C++
#ifndef _TASK2_H_ #define _TASK2_H_ #include &lt;iostream&gt; using namespace std; namespace TeamResult { static int...

МНК, повреждение кучи - 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 операнд, под который выделена динамическая память без соотв. преобразований.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.08.2012, 07:27     Ошибка о повреждение кучи
Еще ссылки по теме:

Странное повреждение кучи - C++
Доброго времени суток, форумчане! Есть проект, в нем реализована функцию дублирования всех элементов статического массива с...

Точка останова(повреждение кучи) - C++
Прошу помочь, смотрел по форуму похожие темы - ответа не нашел void Base::Read() { char* name=new char;//переменная для имени ...

C++ delete[] точка останова/повреждение кучи - C++
Добрый день. Подскажите, пожалуйста. Вот код функции: void interpol(point* a, int n, int k, point* y, int inter) //a-original ...

Повреждение кучи при создании нейросети с количеством слоев больше 51 - C++
Добрый день. Я знаю, таких тем уже много, я их прочитала, но ни в одной не нашла решения моей проблемы. Проблема. Есть нейронная сеть...

Получать различные начала кучи при создании кучи внутри цикла - C++
Можно ли как-то такое провернуть, чтобы на каждой итерации цикла получались различные адреса (выбираются ОС) на начало кучи (периодические...

Ошибка кучи - C++
Здравствуйте, уважаемые программисты. Возникла у меня такая проблема: Задали сделать курсовую работу на С++ через MFC. Суть задачи: В...


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

Или воспользуйтесь поиском по форуму:
alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
29.08.2012, 07:27     Ошибка о повреждение кучи #6
немного теории
Функция strcat присоединяет свой второй аргумент (строку) к первому
аргументу — массиву символов, содержащему строку. Первый символ второго
аргумента замещает нулевой символ ('\0'), который завершал строку в первом
аргументе. Программист должен быть уверен, что массив, используемый для
хранения первой строки, достаточно велик для того, чтобы хранить
комбинацию первой строки, второй строки и завершающего нулевого символа
(скопированного из второй строки).
Yandex
Объявления
29.08.2012, 07:27     Ошибка о повреждение кучи
Ответ Создать тему
Опции темы

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