Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.88/40: Рейтинг темы: голосов - 40, средняя оценка - 4.88
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
1

Ошибки при удалении динамических массивов

22.09.2014, 07:32. Показов 7223. Ответов 20
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
компилируется все нормально, но при вызове delete[] к абсолютно валидным указателям почему то вылетает "HEAP CORRUPTION DETECTED"

town.h
Кликните здесь для просмотра всего текста
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 <Windows.h>
#include <conio.h>
#include <iostream>
#include <fstream>
 
using namespace std;
 
class town //класс населенный пункт
{
private:
    char* name; //название
    double latitude; //широта
    double longitude; //долгота
    char* transport; //виды общественного транспорта
 
    inline char* getname() { return name; }
public:
    //конструктор без параметров
    town();
    //конструктор с параметром задающим название
    town(char* _name);
    //конструктор с параметрами задающими все поля
    town(char* _name, size_t _population, double _latitude, double _longitude, char* _transport);
    //деструктор
    ~town();
    //метод Input выполняет ввод данных из файла
    bool Input();
    //метод Output печатает на экране данные класса
    bool Output();
protected:
    size_t population; //количество жителей
 
    inline size_t getpopulation() { return population; }
};
 
//Функция чистит консоль
bool ClearConsole();
//Функция печатает надпись (флаг inscription), возвращает код нажатой клавиши и, если надо, чистит консоль (флаг cls)
char pause(bool cls = false, bool inscription = true);
//Функция читает введенную строку из переданного потока в динамически выделяемый буфер
char* GetString(istream& stream);

town.cpp
Кликните здесь для просмотра всего текста
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
#include "town.h"
 
town::town()
{
    name = new char;
    *name = 0;
    population = 0;
    latitude = 0.0;
    longitude = 0.0;
    transport = new char;
    *transport = 0;
}
 
town::town(char* _name)
{
    name = new char[strlen(_name)];
    strcpy(name, _name);
    population = 0;
    latitude = 0.0;
    longitude = 0.0;
    transport = new char;
    *transport = 0;
}
 
town::town(char* _name, size_t _population, double _latitude, double _longitude, char* _transport)
{
    name = new char[strlen(_name)];
    strcpy(name, _name);
    population = _population;
    latitude = _latitude;
    longitude = _longitude;
    transport = new char[strlen(_transport)];
    strcpy(transport, _transport);
}
 
town::~town()
{
    if (name) delete[] name;
    population = 0;
    latitude = 0.0;
    longitude = 0.0;
    if (transport) delete[] transport;
}
 
bool town::Input()
{
    char *filename; //имя файла
    char *tmp, *str;
    cout << "filename: "; //запрос имени файла
    filename = GetString(cin);
    tmp = new char[strlen("input\\") + strlen(filename)];
    strcpy(tmp, "input\\");
    strcat(tmp, filename); //добавление папки в которой лежит файл
    ifstream stream(tmp); //открытие потока
    if (!stream.is_open()) return false; //если поток не открылся выход
    delete[] filename;
    delete[] tmp;
 
    //читаю название
    str = GetString(stream);
    sscanf(str, "name=%s", name);
    delete[] str;
 
    //читаю население
    str = GetString(stream);
    sscanf(str, "population=%d", &population);
    delete[] str;
 
    //читаю широту
    str = GetString(stream);
    sscanf(str, "latitude=%lf", &latitude);
    delete[] str;
 
    //читаю долготу
    str = GetString(stream);
    sscanf(str, "longitude=%lf", &longitude);
    delete[] str;
 
    //читаю виды транспорта
    str = GetString(stream);
    sscanf(str, "transport=%s", transport);
    delete[] str;
 
    return true;
}
 
bool town::Output()
{
    cout << "name="       << name       << endl
         << "population=" << population << endl
         << "latitude="   << latitude   << endl
         << "longitude="  << longitude  << endl
         << "transport="  << transport  << endl << endl;
    return true;
}
 
bool ClearConsole()
{
    HANDLE consoleHandle = GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    DWORD written;
    COORD zeroPos = { 0, 0 };
 
    if (GetConsoleScreenBufferInfo(consoleHandle, &csbi))
    {
        DWORD numChars = csbi.dwSize.X * csbi.dwSize.Y;
 
        FillConsoleOutputCharacter(consoleHandle, ' ', numChars, zeroPos, &written);
        FillConsoleOutputAttribute(consoleHandle, csbi.wAttributes, numChars, zeroPos, &written);
    }
    SetConsoleCursorPosition(consoleHandle, zeroPos);
    return consoleHandle;
}
 
char pause(bool cls, bool inscription)
{
    if (inscription) cout << "Для продолжения нажмите любую клавишу . . . ";
    char key = getch();  //cin.get();
    if (cls) ClearConsole();
    return key;
}
 
char* GetString(istream& stream)
{
    char* str = new char;
    size_t length = 1;
    while ((stream.get(str[length - 1])) && (str[length - 1] != '\n'))
    {
        char* tmp = new char[length];
        memcpy(tmp, str, length);
        delete[] str;
        str = new char[length + 1];
        memcpy(str, tmp, length++);
        delete[] tmp;
    }
    str[length - 1] = 0;
    return str;
}

main.cpp
Кликните здесь для просмотра всего текста
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
#include "town.h"
 
int main()
{
    setlocale(LC_ALL, "RUSSIAN");
 
    //использование конструктора по умолчанию
    town a;
    cout << "использование конструктора по умолчанию" << endl << endl;
    a.Output();
    pause(true);
 
    //использование конструктора с параметром задающим название
    town b("Пенза");
    cout << "использование конструктора с параметром задающим название" << endl << endl;
    b.Output();
    pause(true);
 
    //использование конструктора с параметрами задающими все поля
    char* transport = "автобусы, тролейбусы";
    cout << "использование конструктора с параметрами задающими все поля" << endl << endl;
    town c("Пенза", 517311, 53.19, 45.00, transport);
    c.Output();
    pause(true);
 
    //использование массива экземпляров класса с заполнением из файла
    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();
        pause(true);
    }
    delete[] d;
 
    return cin.get();
}


ошибки в town.cpp строки: 38, 42, 57
ошибки в main.cpp строки: 37 (тут немного по другому пишет: "lab2.exe вызвал срабатывание точки останова.")
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.09.2014, 07:32
Ответы с готовыми решениями:

Инициализация динамических массивов при создании
как создавать динамические массивы,чтоб вводить данные с клавиатуры знаю.. примерно это выглядит...

Ошибки при умножении динамических матриц
В строке ввода в вызывающее окружение матрицы выдает ошибку : &quot;Вызвано исключение по адресу...

Создание динамических массивов внутри класса: Нарушение прав доступа при чтении "0xbf800000"
столкнулся с непонятной для меня бедой. Если код написать внутри главной функции то всё работает....

Динамических массивов
Всем доброго дня!!!Если есть минутка, помогите сделать эти задания!буду очень благодарен!! 1....

20
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
23.09.2014, 08:52 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от Cryptoff Посмотреть сообщение
Проблема решается изменением настроек компилятора, в разделе используемая память (использую gcc).
Какая именно проблема?
0
23.09.2014, 08:52
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.09.2014, 08:52
Помогаю со студенческими работами здесь

Использование динамических массивов
Помогите, пожалуйста. Надо выполнить задание, используя динамические массивы В массиве с четным...

Адреса динамических массивов
Как считать конкретное количество элементов из динамического массива чар в строку string? Используя...

Обработка динамических массивов с++
Из одномерного целочисленного массива вывести те элементы, которые являются делителями для...

Создание динамических массивов
Здравствуйте. Подтолкните в верном направлении. В начале пользователь задаёт количество массивов,...


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

Или воспользуйтесь поиском по форуму:
21
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru