Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
C++
 Аватар для JustLearn
3 / 3 / 1
Регистрация: 21.10.2017
Сообщений: 121

Выбрасывается исключение

28.10.2018, 19:36. Показов 957. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер, киберфорумчане! Возникла проблема, надеюсь на вашу помощь!))
P.S. Ниже приложен скриншот.
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
#include <iostream>
#include <conio.h>
using namespace std;
int main() {
    setlocale(LC_ALL, "");
 
    int *ptr = nullptr;
    try {
        ptr = new int[10];
    }
    catch (bad_alloc ex) {
        cout << "Невозможно выделить память под массив цклых чисел.\n";
        return 1;
    }
    for (int i = 0; i < 10; i++) {
        *ptr = i;
        ptr++;
    }
    ptr -= 10;
    for (int i = 0; i < 10; i++) {
        cout << *ptr << endl;
        ptr++;
    }
    delete ptr;
    _getch();
    return 0;
}
Если с
C++
1
delete ptr;
то выводит верный результат работы программы, но при этом выбрасывается исключение.
Без
C++
1
delete ptr;
всё работает как надо.
Как сделать так, чтобы всё работало как надо с
C++
1
delete ptr;
???
И если кто знает, то скажите пожалуйста, почему так происходит.
Миниатюры
Выбрасывается исключение  
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.10.2018, 19:36
Ответы с готовыми решениями:

Тетрис в консоли: почему выбрасывается исключение?
Чувачки можете обьяснить почему у меня идет это прерывание ? Необработанное исключение по адресу 0x01037454 в TETRIS_K.exe:...

Почему не выбрасывается исключение, если файл не открыт?
Почему не кидает исключение , если файл не открыт void SmartArray::to_File(string path) { try { ofstream temp; ...

Выбрасывается исключение при вводе названия фирмы
Добрый день! В моей программе неправильно работает ввод названия фирмы, и я не совсем понимаю,как мне потом выводить данные,если их будет...

8
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
28.10.2018, 19:52
После второго цикла адрес "уехал" вперед на 10 элементов.
0
C++
 Аватар для JustLearn
3 / 3 / 1
Регистрация: 21.10.2017
Сообщений: 121
28.10.2018, 20:27  [ТС]
Croessmah, так и задумывалось. Поэтому после первого цикла я "спустил" назад адрес на 10 элементов.

Добавлено через 2 минуты
Croessmah, всё! Я разобрался! Надо писать delete[] ptr;
Глупая ошибка
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
28.10.2018, 20:29
JustLearn, а после второго - нет. Адрес должен быть тем же, что и вернул `new`.
И еще нужно использовать `delete[]`, если выделялась память с помощью `new[]`.
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
28.10.2018, 20:30
Цитата Сообщение от JustLearn Посмотреть сообщение
Надо писать delete[] ptr;
Это безусловно, в вашем коде.

Только вот то, что адрес у вас уехал, все равно неверно, хоть даже так и задумывалось
Вы в delete[] должны отдать тот же адрес, что вам в свое время вернула new.
Если нужно двигать указатель - создайте копию, и двигайте ее, а в delete[] отдавайте тот же адрес, что вернула new.
1
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
28.10.2018, 20:32
JustLearn, даже лучше так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    int *ptr = new int[10];
    int* pfirst = ptr;
 
    for (int i = 0; i < 10; i++) {
        *ptr = i;
        ptr++;
    }
    ptr -= 10;
    for (int i = 0; i < 10; i++) {
        cout << *ptr << endl;
        ptr++;
    }
    delete[] pfirst;
Добавлено через 41 секунду

Не по теме:

Цитата Сообщение от DrOffset Посмотреть сообщение
Если нужно двигать указатель - создайте копию, и двигайте ее, а в delete[] отдавайте тот же адрес, что вернула new.
вы быстрее успели)

0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
28.10.2018, 20:33
JustLearn, Собственно Azazel-San проиллюстрировал кодом, как надо делать.
Цитата Сообщение от DrOffset Посмотреть сообщение
Если нужно двигать указатель - создайте копию, и двигайте ее
0
C++
 Аватар для JustLearn
3 / 3 / 1
Регистрация: 21.10.2017
Сообщений: 121
28.10.2018, 21:24  [ТС]
DrOffset, хорошо. Но я только не понимаю зачем нужно создавать копию? Почему я не могу пользоваться одним указателем? В чём преимущества того подхода, который Вы предлагаете?

Добавлено через 2 минуты
Azazel-San, спасибо за иллюстрацию кодом) А почему Вы высвобождаете память только одного указателя? Это как-то связано с тем, что Вы присвоили адрес указателя ptr указателю pfirst?

Добавлено через 18 секунд
Azazel-San,
Цитата Сообщение от JustLearn Посмотреть сообщение
Но я только не понимаю зачем нужно создавать копию? Почему я не могу пользоваться одним указателем? В чём преимущества того подхода, который Вы предлагаете?
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
28.10.2018, 21:53
Цитата Сообщение от JustLearn Посмотреть сообщение
Но я только не понимаю зачем нужно создавать копию?
Копию адреса.
Ну вы же программист? Логика - ваш первый инструмент. Вот и давайте думать логически. У вас есть указатель и вам надо его подвигать. Так? При этом вы должны освобождать участок именно по тому адресу, который вам вернула new - это условие корректной работы. Что для этого можно сделать? Можно сохранить оригинальный, возвращенный new указатель в другой указатель, а для "двигания" использовать первый (или наоборот). Сохраненный указатель использовать для освобождения памяти. Либо, другой путь, это в конце работы вернуть указателю (путем "двигания" в обратную сторону) его прежний адрес, чтобы затем передать его в delete[] - тогда указатель будет только один. Первый вариант более простой для реализации, как по мне

Цитата Сообщение от JustLearn Посмотреть сообщение
А почему Вы высвобождаете память только одного указателя?
А сколько раз в этом коде был вызван new? Один. Сколько указателей сделано не играет роли. Вот сами подумайте, у вас листочек с адресом дома, допустим дом решили снести. Если у вас будет 10 таких листочков с адресом одного и того же дома, вы что, будете 10 домов сносить? Нет ведь - только один. Тут тоже самое.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.10.2018, 21:53
Помогаю со студенческими работами здесь

При вызове деструктора в строке delete[] data выбрасывается исключение
вот как раз вопрос по этой теме. программа отрабатывает все команды и в конце при вызове деструктора в строке delete data выбрасывает...

Возникло необработанное исключение по адресу 0x73A62CF2: исключение Microsoft C++: std::bad_array_new_length
Доброго времени суток, уважаемые форумчане :) Подскажите начинающему программисту. Ругается на необработанное исключение по адресу...

Что я сделал не так?Возникло необработанное исключение по адресу 0x7434A9F2 : исключение Microsoft C++: std
//Калькулятор Intrigger #include&lt;iostream&gt; #include&lt;conio.h&gt; #include&lt;string.h&gt; #include&lt;string&gt; #include&lt;cstring&gt; using...

Выбрасывается исключение после компиляции проекта под windows xp
Всем привет! Собираю проект под windows xp в VS17, настройки: Версия пакета SDK: 7.0 Набор инструментов платформы: Visual Studio...

Стек: почему выбрасывается исключение?
//Compiler: 3.3.5.1662 unit TypeStack; interface type T = integer; PNode = ^TNode; TNode = record ...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru