Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
GetHelp
60 / 61 / 11
Регистрация: 27.02.2013
Сообщений: 1,112
1

Heap corruption при вызове деструктора для char*

12.09.2014, 15:39. Просмотров 961. Ответов 26
Метки нет (Все метки)

в классе есть переменная типа char*, в конструкторе ей выделяется память и записывается значение, в деструкторе пытаюсь ее удалить и выскакивает ошибка о_О вообще странно... проверял отладчиком перед вызовом delete переменная не пустая точно...
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.09.2014, 15:39
Ответы с готовыми решениями:

Ошибка "*.exe вызвал срабатывание точки останова" и "HEAP CORRUPTION" при вызове деструктора программой
Здравствуйте! Сделал простенькое упражнение на указатели, но программа выдает...

Heap corruption detected при удалении динамического массива
mystring.cpp - здесь происходит ошибка в функции MyString::operator на строке...

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

Посчитать значения функции Y для диапазона X (Heap corruption detected)
Задача: посчитать значения функции Y для диапазона X(от a до b) по формуле....

Ошибка при вызове деструктора
По окончании программы выдает ошибку #include <string.h> #include <iostream>...

26
ForEveR
В астрале
Эксперт С++
7996 / 4755 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
12.09.2014, 15:41 2
GetHelp, Код.
0
GetHelp
60 / 61 / 11
Регистрация: 27.02.2013
Сообщений: 1,112
12.09.2014, 15:42  [ТС] 3
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
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
#include <iostream>
#include <fstream>
 
using namespace std;
 
const size_t size = 100;
 
class town //класс населенный пункт
{
private:
    char* name; //название
    char* getname() { return name; }
    double latitude; //широта
    double longitude; //долгота
    char** transport; //виды общественного транспорта
    size_t transport_count; //количество видов общественного транспорта
public:
    //конструктор без параметров
    town()
    {
        name = new char[100];
        *name = 0;
        population = 0;
        latitude = 0.0;
        longitude = 0.0;
        transport_count = 0;
    }
    //конструктор с параметром задающим название
    town(char* _name)
    {
        name = new char[strlen(_name)];
        strcpy(name, _name);
        population = 0;
        latitude = 0.0;
        longitude = 0.0;
        transport_count = 0;
    }
    //конструктор с параметрами задающими все поля
    town(char* _name, size_t _population, double _latitude, double _longitude, char** _transport, size_t _transport_count)
    {
        name = new char[strlen(_name)];
        strcpy(name, _name);
        population = _population;
        latitude = _latitude;
        longitude = _longitude;
        transport_count = _transport_count;
        transport = new char*[transport_count];
        for (int i = 0; i < transport_count; i++)
        {
            transport[i] = new char[strlen(_transport[i])];
            strcpy(transport[i], _transport[i]);
        }
    }
    //деструктор
    ~town()
    {
        delete[] name;
        population = 0;
        latitude = 0.0;
        longitude = 0.0;
        if (transport_count)
        {
            for (int i = 0; i < transport_count; i++)
                delete[] transport[i];
            delete[] transport;
        }
        transport_count = 0;
    }
    //метод Input выполняет ввод данных из файла
    bool Input()
    {
        char *filename = new char[100]; //имя файла
        char *tmp = new char[100], *str = new char[100];
        cout << "filename: "; //запрос имени файла
        cin >> filename; //чтение имени файла из потока
        strcpy(tmp, "input\\");
        strcat(tmp, filename); //добавление папки в которой лежит файл
        ifstream stream(tmp); //открытие потока
        if (!stream.is_open()) return false; //если поток не открылся выход
 
        //читаю название
        stream.getline(str, 100);
        sscanf(str, "name=%s", name);
 
        //читаю население
        stream.getline(str, 100);
        sscanf(str, "population=%d", &population);
 
        //читаю широту
        stream.getline(str, 100);
        sscanf(str, "latitude=%lf", &latitude);
 
        //читаю долготу
        stream.getline(str, 100);
        sscanf(str, "longitude=%lf", &longitude);
 
        //читаю виды транспорта
        stream.getline(str, 100);
        sscanf(str, "transport=%s", tmp);
        memset(str, 0, 100);
        strcpy(str, tmp);
        char* _tmp = str;
        while (char* pos = strchr(_tmp, ','))
        {
            size_t index = 0;
            memset(tmp, 0, 100);
            for (; _tmp < pos; _tmp++)
                tmp[index++] = (*_tmp);
            char** transport_temp = new char*[++transport_count];
            for (int i = 0; i < transport_count; i++)
            {
                transport_temp[i] = new char[100];
                if (transport_count - 1 > 0)
                    if (i < transport_count - 1)
                        strcpy(transport_temp[i], transport[i]);
            }
            strcpy(transport_temp[transport_count - 1], tmp);
            if (transport_count - 1) delete[] transport;
            transport = transport_temp;
            memset(tmp, 0, 100);
            _tmp = pos + 1;
        }
        if (*_tmp)
        {
            size_t index = 0;
            memset(tmp, 0, 100);
            for (; _tmp < strchr(str, 0); _tmp++)
                tmp[index++] = (*_tmp);
            char** transport_temp = new char*[++transport_count];
            for (int i = 0; i < transport_count; i++)
            {
                transport_temp[i] = new char[100];
                if (transport_count - 1 > 0)
                    if (i < transport_count - 1)
                        strcpy(transport_temp[i], transport[i]);
            }
            strcpy(transport_temp[transport_count - 1], tmp);
            if (transport_count - 1) delete[] transport;
            transport = transport_temp;
        }
    }
    //метод Output печатает на экране данные класса
    bool Output()
    {
        cout << "name=" << name << "\n";
        cout << "population=" << population << "\n";
        cout << "latitude=" << latitude << "\n";
        cout << "longitude=" << longitude << "\n";
        cout << "transport=";
        for (int i = 0; i < transport_count; i++)
        {
            if (i < transport_count - 1)
                cout << transport[i] << ",";
            else
                cout << transport[i];
        }
        cout << "\n\n";
        return true;
    }
protected:
    size_t population; //количество жителей
    size_t getpopulation() { return population; }
};
 
int main()
{
    setlocale(LC_ALL, "RUSSIAN");
 
    //использование конструктора по умолчанию
    town a;
    cout << "использование конструктора по умолчанию" << endl << endl;
    a.Output();
    system("pause");
    system("cls");
 
    //использование конструктора с параметром задающим название
    town b("Пенза");
    cout << "использование конструктора с параметром задающим название" << endl << endl;
    b.Output();
    system("pause");
    system("cls");
 
    //использование конструктора с параметрами задающими все поля
    char** transport;
    transport = new char*[2];
    transport[0] = "автобусы";
    transport[1] = "тролейбусы";
    cout << "использование конструктора с параметрами задающими все поля" << endl << endl;
    town c("Пенза", 517311, 53.19, 45.00, transport, 2);
    c.Output();
    system("pause");
    system("cls");
 
    c.~town();
 
    //использование массива экземпляров класса с заполнением из файла
    const size_t size = 3;
    town* d = new town[size];
    for (int i = 0; i < size; i++)
    {
        cout << "использование массива экземпляров класса с заполнением из файла" << endl << endl;
        d[i].Input();
        cout << endl;
        d[i].Output();
        system("pause");
        system("cls");
    }
    delete[] d;
 
    return cin.get();
}
0
ForEveR
В астрале
Эксперт С++
7996 / 4755 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
12.09.2014, 15:47 4
GetHelp, Зачем?
C++
1
c.~town();
Может и не важно, но зачем явно звать деструктор?
0
GetHelp
60 / 61 / 11
Регистрация: 27.02.2013
Сообщений: 1,112
12.09.2014, 15:49  [ТС] 5
Цитата Сообщение от ForEveR Посмотреть сообщение
Может и не важно, но зачем явно звать деструктор?
это так просто для удобства отладки, чтоб не прошагивать заполнение массива из файлов... ошибка же возникает в деструкторе... потом уберу
0
John Prick
836 / 767 / 258
Регистрация: 27.07.2012
Сообщений: 2,179
Завершенные тесты: 3
12.09.2014, 16:14 6
Не знаю, как получается порча кучи, но ошибка, судя по всему, здесь:
C++
1
2
        name = new char[strlen(_name)];
        strcpy(name, _name);
Забыл дописать нулевой символ:
C++
1
2
3
4
        int len = strlen(_name)
        name = new char[len + 1];
        strcpy(name, _name);
        name[len] = '\0';
Добавлено через 2 минуты
Ну то есть это везде надо исправить, где копирование есть.
1
edwvee
20 / 20 / 2
Регистрация: 27.01.2014
Сообщений: 232
12.09.2014, 16:15 7
Дай пример файла с которым работаешь
0
GetHelp
60 / 61 / 11
Регистрация: 27.02.2013
Сообщений: 1,112
12.09.2014, 16:26  [ТС] 8
John Prick, спасибо помогло, поправил
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
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
#include <iostream>
#include <fstream>
 
using namespace std;
 
const size_t size = 100;
 
class town //класс населенный пункт
{
private:
    char* name; //название
    char* getname() { return name; }
    double latitude; //широта
    double longitude; //долгота
    char** transport; //виды общественного транспорта
    size_t transport_count; //количество видов общественного транспорта
public:
    //конструктор без параметров
    town()
    {
        name = new char[100];
        *name = 0;
        population = 0;
        latitude = 0.0;
        longitude = 0.0;
        transport_count = 0;
    }
    //конструктор с параметром задающим название
    town(char* _name)
    {
        name = new char[strlen(_name) + 1];
        strcpy(name, _name);
        name[strlen(_name)] = 0;
        population = 0;
        latitude = 0.0;
        longitude = 0.0;
        transport_count = 0;
    }
    //конструктор с параметрами задающими все поля
    town(char* _name, size_t _population, double _latitude, double _longitude, char** _transport, size_t _transport_count)
    {
        name = new char[strlen(_name) + 1];
        strcpy(name, _name);
        name[strlen(_name)] = 0;
        population = _population;
        latitude = _latitude;
        longitude = _longitude;
        transport_count = _transport_count;
        transport = new char*[transport_count];
        for (int i = 0; i < transport_count; i++)
        {
            transport[i] = new char[100];
            strcpy(transport[i], _transport[i]);
            transport[strlen(_transport[i])] = 0;
        }
    }
    //деструктор
    ~town()
    {
        delete[] name;
        population = 0;
        latitude = 0.0;
        longitude = 0.0;
        if (transport_count)
        {
            for (int i = 0; i < transport_count; i++)
                delete[] transport[i];
            delete[] transport;
        }
        transport_count = 0;
    }
    //метод Input выполняет ввод данных из файла
    bool Input()
    {
        char *filename = new char[100]; //имя файла
        char *tmp = new char[100], *str = new char[100];
        cout << "filename: "; //запрос имени файла
        cin >> filename; //чтение имени файла из потока
        strcpy(tmp, "input\\");
        strcat(tmp, filename); //добавление папки в которой лежит файл
        ifstream stream(tmp); //открытие потока
        if (!stream.is_open()) return false; //если поток не открылся выход
 
        //читаю название
        stream.getline(str, 100);
        sscanf(str, "name=%s", name);
 
        //читаю население
        stream.getline(str, 100);
        sscanf(str, "population=%d", &population);
 
        //читаю широту
        stream.getline(str, 100);
        sscanf(str, "latitude=%lf", &latitude);
 
        //читаю долготу
        stream.getline(str, 100);
        sscanf(str, "longitude=%lf", &longitude);
 
        //читаю виды транспорта
        stream.getline(str, 100);
        sscanf(str, "transport=%s", tmp);
        memset(str, 0, 100);
        strcpy(str, tmp);
        char* _tmp = str;
        while (char* pos = strchr(_tmp, ','))
        {
            size_t index = 0;
            memset(tmp, 0, 100);
            for (; _tmp < pos; _tmp++)
                tmp[index++] = (*_tmp);
            char** transport_temp = new char*[++transport_count];
            for (int i = 0; i < transport_count; i++)
            {
                transport_temp[i] = new char[100];
                if (transport_count - 1 > 0)
                    if (i < transport_count - 1)
                        strcpy(transport_temp[i], transport[i]);
            }
            strcpy(transport_temp[transport_count - 1], tmp);
            if (transport_count - 1) delete[] transport;
            transport = transport_temp;
            memset(tmp, 0, 100);
            _tmp = pos + 1;
        }
        if (*_tmp)
        {
            size_t index = 0;
            memset(tmp, 0, 100);
            for (; _tmp < strchr(str, 0); _tmp++)
                tmp[index++] = (*_tmp);
            char** transport_temp = new char*[++transport_count];
            for (int i = 0; i < transport_count; i++)
            {
                transport_temp[i] = new char[100];
                if (transport_count - 1 > 0)
                    if (i < transport_count - 1)
                        strcpy(transport_temp[i], transport[i]);
            }
            strcpy(transport_temp[transport_count - 1], tmp);
            if (transport_count - 1) delete[] transport;
            transport = transport_temp;
        }
    }
    //метод Output печатает на экране данные класса
    bool Output()
    {
        cout << "name=" << name << "\n";
        cout << "population=" << population << "\n";
        cout << "latitude=" << latitude << "\n";
        cout << "longitude=" << longitude << "\n";
        cout << "transport=";
        for (int i = 0; i < transport_count; i++)
        {
            if (i < transport_count - 1)
                cout << transport[i] << ",";
            else
                cout << transport[i];
        }
        cout << "\n\n";
        return true;
    }
protected:
    size_t population; //количество жителей
    size_t getpopulation() { return population; }
};
 
int main()
{
    setlocale(LC_ALL, "RUSSIAN");
 
    //использование конструктора по умолчанию
    town a;
    cout << "использование конструктора по умолчанию" << endl << endl;
    a.Output();
    system("pause");
    system("cls");
 
    //использование конструктора с параметром задающим название
    town b("Пенза");
    cout << "использование конструктора с параметром задающим название" << endl << endl;
    b.Output();
    system("pause");
    system("cls");
 
    //использование конструктора с параметрами задающими все поля
    char** transport;
    transport = new char*[2];
    transport[0] = "автобусы";
    transport[1] = "тролейбусы";
    cout << "использование конструктора с параметрами задающими все поля" << endl << endl;
    town c("Пенза", 517311, 53.19, 45.00, transport, 2);
    c.Output();
    system("pause");
    system("cls");
 
    c.~town();
 
    //использование массива экземпляров класса с заполнением из файла
    const size_t size = 3;
    town* d = new town[size];
    for (int i = 0; i < size; i++)
    {
        cout << "использование массива экземпляров класса с заполнением из файла" << endl << endl;
        d[i].Input();
        cout << endl;
        d[i].Output();
        system("pause");
        system("cls");
    }
    delete[] d;
 
    return cin.get();
}
и еще ошибка выскакивает при удалении массива видов транспорта (тоже в деструкторе), там ничего уже в ошибке не написано, просто "lab2.exe вызвал срабатывание точки останова." и еще какой то ntdll.pdb пишет не подключен якобы...
Цитата Сообщение от edwvee Посмотреть сообщение
Дай пример файла с которым работаешь
Кликните здесь для просмотра всего текста
name=Москва
population=11500000
latitude=55,75
longitude=37,61
transport=метро,автобусы,трамваи
0
John Prick
836 / 767 / 258
Регистрация: 27.07.2012
Сообщений: 2,179
Завершенные тесты: 3
12.09.2014, 16:35 9
Цитата Сообщение от GetHelp Посмотреть сообщение
и еще ошибка выскакивает при удалении массива видов транспорта (тоже в деструкторе), там ничего уже в ошибке не написано, просто "lab2.exe вызвал срабатывание точки останова." и еще какой то ntdll.pdb пишет не подключен якобы...
Это я уже хз. Попробуй пересобери весь проект.
0
GetHelp
60 / 61 / 11
Регистрация: 27.02.2013
Сообщений: 1,112
12.09.2014, 17:25  [ТС] 10
Цитата Сообщение от John Prick Посмотреть сообщение
Это я уже хз. Попробуй пересобери весь проект.
да нет, думаю тут дело в коде все также... что то опять с выделениями памяти перехимичил =( надо просто найти где косяк
0
alsav22
5442 / 4837 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
12.09.2014, 18:01 11
Цитата Сообщение от GetHelp Посмотреть сообщение
C++
1
name = new char[strlen(_name)];
Памяти не хватает под '\0'.

Добавлено через 2 минуты
И тут:
C++
1
transport[i] = new char[strlen(_transport[i])];
0
rikimaru2013
C++ Game Dev
2472 / 1141 / 348
Регистрация: 30.11.2013
Сообщений: 3,709
12.09.2014, 18:05 12
C++
1
2
3
private:
char* name; //название
char* getname() { return name; }
Зачем private аксессор? У кого будет доступ к аксессору, у того и будет доступ к полю.

Добавлено через 1 минуту
C++
1
2
 strcpy(name, _name);
        name[strlen(_name)] = 0;
strcpy ставит нулевой байт.
З.Ы. Используйте strcpy_s
0
alsav22
5442 / 4837 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
12.09.2014, 18:05 13
И возврат true из Input() сделайте, если всё нормально, соответственно используйте это в main().
0
rikimaru2013
C++ Game Dev
2472 / 1141 / 348
Регистрация: 30.11.2013
Сообщений: 3,709
12.09.2014, 18:09 14
C++
1
2
3
population = 0;
latitude = 0.0;
longitude = 0.0;
зачем обнулять поля в деструкторе? Они будут удалены вместе с объектом класса


C++
1
2
char *filename = new char[100]; //имя файла
char *tmp = new char[100], *str = new char[100];
удалите выделенную память через delete - утечка
0
GetHelp
60 / 61 / 11
Регистрация: 27.02.2013
Сообщений: 1,112
12.09.2014, 18:23  [ТС] 15
Цитата Сообщение от alsav22 Посмотреть сообщение
Памяти не хватает под '\0'.
все там хватает...
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Зачем private аксессор? У кого будет доступ к аксессору, у того и будет доступ к полю.
каприз препода, лаба на инкапсуляцию, нужны методы и переменные всех 3х типов доступа...
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
strcpy ставит нулевой байт.
З.Ы. Используйте strcpy_s
не знал... а зачем strcpy_s? (и вообще чем она отличается)
Цитата Сообщение от alsav22 Посмотреть сообщение
И возврат true из Input() сделайте, если всё нормально, соответственно используйте это в main().
а ну да, забыл прост...
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
зачем обнулять поля в деструкторе? Они будут удалены вместе с объектом класса
это тоже каприз препода
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
удалите выделенную память через delete - утечка
забыл, удалю...

а что все же с моей последней ошибкой?
0
rikimaru2013
C++ Game Dev
2472 / 1141 / 348
Регистрация: 30.11.2013
Сообщений: 3,709
12.09.2014, 18:28 16
GetHelp, Скинь исправленный код полностью и скопируй сюда что пишет "ошибка"
0
GetHelp
60 / 61 / 11
Регистрация: 27.02.2013
Сообщений: 1,112
12.09.2014, 18:38  [ТС] 17
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
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
#include <iostream>
#include <fstream>
 
using namespace std;
 
const size_t size = 100;
 
class town //класс населенный пункт
{
private:
    char* name; //название
    char* getname() { return name; }
    double latitude; //широта
    double longitude; //долгота
    char** transport; //виды общественного транспорта
    size_t transport_count; //количество видов общественного транспорта
public:
    //конструктор без параметров
    town()
    {
        name = new char[100];
        *name = 0;
        population = 0;
        latitude = 0.0;
        longitude = 0.0;
        transport_count = 0;
    }
    //конструктор с параметром задающим название
    town(char* _name)
    {
        name = new char[strlen(_name) + 1];
        strcpy(name, _name);
        population = 0;
        latitude = 0.0;
        longitude = 0.0;
        transport_count = 0;
    }
    //конструктор с параметрами задающими все поля
    town(char* _name, size_t _population, double _latitude, double _longitude, char** _transport, size_t _transport_count)
    {
        name = new char[strlen(_name) + 1];
        strcpy(name, _name);
        population = _population;
        latitude = _latitude;
        longitude = _longitude;
        transport_count = _transport_count;
        transport = new char*[transport_count];
        for (int i = 0; i < transport_count; i++)
        {
            transport[i] = new char[100];
            strcpy(transport[i], _transport[i]);
        }
    }
    //деструктор
    ~town()
    {
        if (name)
            delete[] name;
        population = 0;
        latitude = 0.0;
        longitude = 0.0;
        if (transport_count)
        {
            for (int i = 0; i < transport_count; i++)
                delete[] transport[i];
            delete[] transport;
        }
        transport_count = 0;
    }
    //метод Input выполняет ввод данных из файла
    bool Input()
    {
        char *filename = new char[100]; //имя файла
        char *tmp = new char[100], *str = new char[100];
        cout << "filename: "; //запрос имени файла
        cin >> filename; //чтение имени файла из потока
        strcpy(tmp, "input\\");
        strcat(tmp, filename); //добавление папки в которой лежит файл
        ifstream stream(tmp); //открытие потока
        if (!stream.is_open()) return false; //если поток не открылся выход
 
        //читаю название
        stream.getline(str, 100);
        sscanf(str, "name=%s", name);
 
        //читаю население
        stream.getline(str, 100);
        sscanf(str, "population=%d", &population);
 
        //читаю широту
        stream.getline(str, 100);
        sscanf(str, "latitude=%lf", &latitude);
 
        //читаю долготу
        stream.getline(str, 100);
        sscanf(str, "longitude=%lf", &longitude);
 
        //читаю виды транспорта
        stream.getline(str, 100);
        sscanf(str, "transport=%s", tmp);
        memset(str, 0, 100);
        strcpy(str, tmp);
        char* _tmp = str;
        while (char* pos = strchr(_tmp, ','))
        {
            size_t index = 0;
            memset(tmp, 0, 100);
            for (; _tmp < pos; _tmp++)
                tmp[index++] = (*_tmp);
            char** transport_temp = new char*[++transport_count];
            for (int i = 0; i < transport_count; i++)
            {
                transport_temp[i] = new char[100];
                if (transport_count - 1 > 0)
                    if (i < transport_count - 1)
                        strcpy(transport_temp[i], transport[i]);
            }
            strcpy(transport_temp[transport_count - 1], tmp);
            if (transport_count - 1) delete[] transport;
            transport = transport_temp;
            memset(tmp, 0, 100);
            _tmp = pos + 1;
        }
        if (*_tmp)
        {
            size_t index = 0;
            memset(tmp, 0, 100);
            for (; _tmp < strchr(str, 0); _tmp++)
                tmp[index++] = (*_tmp);
            char** transport_temp = new char*[++transport_count];
            for (int i = 0; i < transport_count; i++)
            {
                transport_temp[i] = new char[100];
                if (transport_count - 1 > 0)
                    if (i < transport_count - 1)
                        strcpy(transport_temp[i], transport[i]);
            }
            strcpy(transport_temp[transport_count - 1], tmp);
            if (transport_count - 1) delete[] transport;
            transport = transport_temp;
        }
 
        delete[] filename;
        delete[] tmp;
        delete[] str;
 
        return true;
    }
    //метод Output печатает на экране данные класса
    bool Output()
    {
        cout << "name=" << name << "\n";
        cout << "population=" << population << "\n";
        cout << "latitude=" << latitude << "\n";
        cout << "longitude=" << longitude << "\n";
        cout << "transport=";
        for (int i = 0; i < transport_count; i++)
        {
            if (i < transport_count - 1)
                cout << transport[i] << ",";
            else
                cout << transport[i];
        }
        cout << "\n\n";
        return true;
    }
protected:
    size_t population; //количество жителей
    size_t getpopulation() { return population; }
};
 
int main()
{
    setlocale(LC_ALL, "RUSSIAN");
 
    //использование конструктора по умолчанию
    town a;
    cout << "использование конструктора по умолчанию" << endl << endl;
    a.Output();
    system("pause");
    system("cls");
 
    //использование конструктора с параметром задающим название
    town b("Пенза");
    cout << "использование конструктора с параметром задающим название" << endl << endl;
    b.Output();
    system("pause");
    system("cls");
 
    //использование конструктора с параметрами задающими все поля
    char** transport;
    transport = new char*[2];
    transport[0] = "автобусы";
    transport[1] = "тролейбусы";
    cout << "использование конструктора с параметрами задающими все поля" << endl << endl;
    town c("Пенза", 517311, 53.19, 45.00, transport, 2);
    c.Output();
    system("pause");
    system("cls");
 
    c.~town();
 
    //использование массива экземпляров класса с заполнением из файла
    const size_t size = 3;
    town* d = new town[size];
    for (int i = 0; i < size; i++)
    {
        cout << "использование массива экземпляров класса с заполнением из файла" << endl << endl;
        d[i].Input();
        cout << endl;
        d[i].Output();
        system("pause");
        system("cls");
    }
    delete[] d;
 
    return cin.get();
}
Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)

Добавлено через 1 минуту
причем это выдается в конце уже, т.е. проходит несколько деструкторов нормально и в каком то возникает ошибка...
0
КОП
526 / 383 / 120
Регистрация: 15.08.2010
Сообщений: 1,076
Завершенные тесты: 1
12.09.2014, 18:39 18
GetHelp, так со строками и остались косяки

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    //использование конструктора с параметрами задающими все поля
    char** transport;
    transport = new char*[2];
    transport[0] = new char[100];
    transport[1] = new char[100];
    strcpy(transport[0], "автобусы");
    strcpy(transport[1], "троллейбусы"); //с двумя л
    cout << "использование конструктора с параметрами задающими все поля" << endl << endl;
    town c("Пенза", 51, 53.19, 45.00, transport, 2);
    c.Output();
    system("pause");
    system("cls");
 
    //c.~town();

Не по теме:

0x10, где же вы? :DD

0
GetHelp
60 / 61 / 11
Регистрация: 27.02.2013
Сообщений: 1,112
12.09.2014, 18:42  [ТС] 19
КОП, не думаю что в этом проблема, это как раз таки не обязательно...
0
alsav22
5442 / 4837 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
12.09.2014, 18:50 20
Цитата Сообщение от КОП Посмотреть сообщение
GetHelp, так со строками и остались косяки
Не обязательно память здесь выделять, у него в конструкторе это делается:
C++
1
2
3
4
5
6
7
 
transport = new char*[transport_count];
for (int i = 0; i < transport_count; i++)
{
       transport[i] = new char[100];
       strcpy(transport[i], _transport[i]);
}
Добавлено через 1 минуту
Цитата Сообщение от GetHelp Посмотреть сообщение
причем это выдается в конце уже
После работы с файлом?
0
12.09.2014, 18:50
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.09.2014, 18:50

Ошибка при вызове деструктора
Программа компилиться нормально,но после выполнения system(&quot;pause&quot;); выползает...

Ошибка при вызове деструктора
Добрый вечер! Почему при вызове деструктора вылетает ошибка после компиляции...

Проблемы при вызове деструктора
В процессе работы программы указатель на класс Dictionary,который является...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

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