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

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

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

Студворк — интернет-сервис помощи студентам
компилируется все нормально, но при вызове 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
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.09.2014, 07:32
Ответы с готовыми решениями:

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

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

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

20
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
23.09.2014, 08:52
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Cryptoff Посмотреть сообщение
Проблема решается изменением настроек компилятора, в разделе используемая память (использую gcc).
Какая именно проблема?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.09.2014, 08:52

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
21
Ответ Создать тему
Новые блоги и статьи
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru