Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
 Аватар для Букер
2 / 2 / 0
Регистрация: 01.10.2016
Сообщений: 63

Ответить на вопросы об исключениях

01.07.2017, 16:02. Показов 1830. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
1. Если деструктор выбрасывает исключение, то начинается неопределенное поведение.
2. Если конструктор выбрасывает исключение, то объект не создается.
3. При нехватке памяти выбрасывается bad_alloc.
Если я где-то неправ, прошу указать на ошибку.
Также интересует, что произойдет, если в обработчике исключения возникнет новое исключение?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.07.2017, 16:02
Ответы с готовыми решениями:

Ответить на вопросы
1. Какое условие является обязательным для присвоения одного объекта другому? 2. Когда объект передается функции в качестве аргумента,...

Ответить на вопросы из тестов по c++
1. Какие из следующих функций являются встроенными? а) void foo () inline {} б) inline: void foo () {} в) inline void foo () {} 2....

Помогите ответить на вопросы теста!

17
Заблокирован
01.07.2017, 16:18
Цитата Сообщение от Букер Посмотреть сообщение
Если я где-то неправ, прошу указать на ошибку.
В первом.
0
 Аватар для Букер
2 / 2 / 0
Регистрация: 01.10.2016
Сообщений: 63
01.07.2017, 16:20  [ТС]
Что происходит, когда деструктор кидает исключение?
0
Заблокирован
01.07.2017, 16:23
Цитата Сообщение от Букер Посмотреть сообщение
Что происходит, когда деструктор кидает исключение?
Происходит ровно то же, что и когда не деструктор кидает исключение.
1
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
01.07.2017, 16:37
Лучший ответ Сообщение было отмечено Букер как решение

Решение

Цитата Сообщение от Букер Посмотреть сообщение
1. Если деструктор выбрасывает исключение, то начинается неопределенное поведение.
Нет. А начиная с C++11 по дефолту деструкторы noexcept,
там вообще сразу в std::terminate уходим.
Для более ранних стандартов ничего не будет.
Но если деструктор кинет исключение во время раскрутки стека,
то мы также уйдем в std::terminate.
Цитата Сообщение от Букер Посмотреть сообщение
2. Если конструктор выбрасывает исключение, то объект не создается.
Формально - да. Объект считается не созданным.
Для него даже деструктор вызываться не будет.
Цитата Сообщение от Букер Посмотреть сообщение
3. При нехватке памяти выбрасывается bad_alloc.
По стандарту - да (для new), но не факт, что new сможет распознать ошибку выделения.

Цитата Сообщение от Букер Посмотреть сообщение
если в обработчике исключения возникнет новое исключение?
Ничего. Выбросится исключение, как и обычно.
1
 Аватар для Букер
2 / 2 / 0
Регистрация: 01.10.2016
Сообщений: 63
01.07.2017, 17:22  [ТС]
Благодарю за помощь. Еще один вопрос.
Что будет выведено на экран в результате выполнения следующего кода:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
try
{
 try
 {
    cout << 1;
           throw runtime_exception();
           cout << 2;
 }
 catch(runtime_exception const & ex)
 {
    cout << 3;
    throw ex;
    cout << 4;
 }
 catch(...)
 {
    cout << 5;
 }
}
catch(runtime_exception const &)
{
 cout << 6;
}
Что за runtime_exception()? Какой обработчик его поймает? Код не компилируется, пишет, что рантайм() не объявлен. Подключал <exception>, <stdexcept> - результата ноль.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
01.07.2017, 17:30
Лучший ответ Сообщение было отмечено Букер как решение

Решение

Цитата Сообщение от Букер Посмотреть сообщение
Что за runtime_exception()?
Некий тип, объект которого и будем выбрасывать.
Можете сделать просто struct runtime_exception{};
Цитата Сообщение от Букер Посмотреть сообщение
Какой обработчик его поймает?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
try
{
 try
 {
    cout << 1;//Вывод 1
           throw runtime_exception();//Выбрасываем исключение_1
           cout << 2;//Сюда не дойдем
 }
 catch(runtime_exception const & ex)//исключение_1 поймаем здесь
 {
    cout << 3;//Вывод 3
    throw ex;//Выбрасываем другое исключение_2 - копию ex (из catch исключение спокойно полетит выше)
    cout << 4;//Сюда не дойдем
 }
 catch(...)//Сюда не попадем - прошлая секция поймала исключение_1
 {
    cout << 5;
 }
}
catch(runtime_exception const &)//исключение_2 поймаем здесь
{
 cout << 6;//Вывод 6
}
Цитата Сообщение от Букер Посмотреть сообщение
то будет выведено на экран в результате выполнения следующего кода
136
1
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
01.07.2017, 17:30
Цитата Сообщение от Букер Посмотреть сообщение
Что за runtime_exception()?
У автора кода спрашивайте. throw абсолютно все равно какой тип кидать, лишь бы был объявленным или "вшитым" (типа int).
Цитата Сообщение от Букер Посмотреть сообщение
Какой обработчик его поймает?
У которого в аргументе стоит runtime_exception или на худой конец его предок. catch опять же абсолютно все равно что ловить.
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
01.07.2017, 17:30
ожидаемый вывод: 136
Цитата Сообщение от Букер Посмотреть сообщение
Что за runtime_exception()?
один из ваших классов, нужно думать.
Цитата Сообщение от Букер Посмотреть сообщение
пишет, что рантайм() не объявлен.
наверное, потому что вы его не объявили.
Цитата Сообщение от Букер Посмотреть сообщение
Подключал <exception>, <stdexcept> - результата ноль.
попробуйте <stdexcept> и std::runtime_error

говорят балбесам помогает.
0
 Аватар для Букер
2 / 2 / 0
Регистрация: 01.10.2016
Сообщений: 63
01.07.2017, 17:38  [ТС]
Благодарю, вы очень понятно все объяснили.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
01.07.2017, 18:01
Букер, вот Вы написали:
Цитата Сообщение от Букер Посмотреть сообщение
Если конструктор выбрасывает исключение, то объект не создается.
и это верно. Но самое интересное, это то, что объект данного исключения должен нести обработчику информацию о всех уже захваченных ресурсах до точки выброса, которые по нормальной схеме освободились бы в деструкторе. И поскольку нет правды в том чтобы писать код обработчика оперирующий внутренностями объекта, то определяют класс исключения как вложенный и создают его объект с параметрами которые он понимает и умеет освобождать. Но он может ещё и передать часть инфы наружу. Это может быть и та информация, которая при освобождении ресурса будет утрачена или просто сообщение "попал под лошадь О. Бендер...". Чтобы родные и близкие поняли как именно всё случилось.
А обработчик в каждом контексте уже решает, обработать всё или часть или просто передать дальше.
Это трудно для меня написать правильно и безукоризненно, поэтому возможно, последуют уточнения.
0
Заблокирован
01.07.2017, 19:09
Цитата Сообщение от IGPIGP Посмотреть сообщение
Но самое интересное, это то, что объект данного исключения должен нести обработчику информацию о всех уже захваченных ресурсах до точки выброса
Зачем? У всех инициализированных к моменту возбуждения исключения полей объекта вызываются деструкторы. Они и освобождают всё, что было выделено.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
01.07.2017, 19:21
Цитата Сообщение от daun-autist Посмотреть сообщение
У всех инициализированных к моменту возбуждения исключения полей объекта вызываются деструкторы. Они и освобождают всё, что было выделено.
Хорошо если они есть. То есть, в тривиальном случае, Вы правы,и тогда даже деструктор объекту не нужен. Но если приходится освобождать что-то самому, то в деструкторе оно и прописывается, же.
Представьте, что выделяется матрица 10x10 в динамической памяти и на пятой строке - исключение. Кто освободит четыре указателя инициализированные выделенной памятью. trow это подобие return и функция закончит работу. Информация о данных указателях будет утеряна если не передать дальше. Память будет утеряна.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
01.07.2017, 19:30
IGPIGP, если предварительно инициализировать указатели нулями, то можно в catch вызвать функцию deallocate_matrix, которая почистит всё.
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
01.07.2017, 20:43
Цитата Сообщение от Croessmah Посмотреть сообщение
IGPIGP, если предварительно инициализировать указатели нулями, то можно в catch вызвать функцию deallocate_matrix, которая почистит всё.
А можно и передать инфу а потом почистить. Я как раз и говорю, что деструкторы полей тут не помогают и нужно что-то сделать. Именно это и помогает сделать исключение. Можно сохранить эти цепочки в лог перед удалением или как-то использовать... Например повыключать всем свет на районе. Если там именно эта инфа. А потом уже освободить.

Не по теме:

deallocate_matrix если она член класса то плохо.

0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
01.07.2017, 20:50
IGPIGP, можно просто использовать scope_quard
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
01.07.2017, 21:22
Цитата Сообщение от Croessmah Посмотреть сообщение
IGPIGP, можно просто использовать
Как я понял, это случай когда освобождать в деструкторе не нужно, а при аварийном ходе выполнения, - нужно. В исключении, это может быть сделано, конечно. Но это частный случай.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
01.07.2017, 21:25
Цитата Сообщение от IGPIGP Посмотреть сообщение
Как я понял, это случай когда освобождать в деструкторе не нужно, а при аварийном случае - нужно.
Почему?
C++
1
2
3
4
5
6
7
8
9
10
11
12
Some()
   : m_arr(nullptr) 
{
   std::unique_ptr<int[]> arr(new int[100500]);
   //делаем что угодно
   m_arr = arr.release();//Отказываемся от владения
}
 
~Some()
{
   delete[] m_arr;
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.07.2017, 21:25
Помогаю со студенческими работами здесь

Ответить на теоретические вопросы по заданному фрагменту кода
Приведенный фрагмент программы struct point //шаблон для хранения координат точки { int x, y; } z; FILE *f; f = fopen( “point...

Что почитать чтобы ответить на следующие вопросы?
прошу посоветовать что почитать чтобы ответить на следующие вопросы!!(можно ответить ссылками) если будут промеры по теме буду рад:) ...

Ответить на вопросы
Имеются описания type digit = '0'..'9'; var d: digit; k:0..9; n:integer;Ответить на следующие вопросы: a) Каковы значения типа digit?...

как ответить на вопросы???
1. Выберите правильное соответствие сетевых масок? /255.255.0.0 = /8 /255.255.248.0 = /21 /255.255.255.128 = /26 ...

Ответить на вопросы теста
Добрый день! Я написал тест по C# .В моих ответах возможны ошибки помогите найти и исправить. заранее,спасибо. 1. Расположите события...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru