Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.06.2016, 21:26   #11
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Цитата:
Сообщение от zumm Посмотреть сообщение
А мне бы все же хотелось узнать как делать универсально правильно.
Либо не вызывать функции, которые могут вызвать исключение, либо перехватывать исключения внутри деструктора.

К примеру, зачем вам вызывать close в деструкторе? Сокет класс будет разрушен и сам позаботится о себе, а если он этого не делает, то грош цена такому классу.
waleri вне форума Ответить с цитированием
Старый 21.06.2016, 01:08   #12
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Коротко - исключения никогда не должны вылетать из деструктора.
Мало того, в новых стандартах деструкторы по дефолту являются noexcept,
соответственно, если вылетит исключение, то будет вызван std::terminate,
который приведет (по дефолту) к вызову std::abort и приложение, фактически, аварийно завершится.

Последний раз редактировалось Croessmah; 21.06.2016 в 01:11.
Croessmah вне форума Ответить с цитированием
Старый 21.06.2016, 21:30   #13
zumm
БохЪ
Форумчанин
 
Аватар для zumm
 
Регистрация: 30.09.2009
Сообщений: 724
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Нету более универсального, решать по ситуации.

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

Цитата:
Сообщение от waleri Посмотреть сообщение
Либо не вызывать функции, которые могут вызвать исключение, либо перехватывать исключения внутри деструктора.

К примеру, зачем вам вызывать close в деструкторе? Сокет класс будет разрушен и сам позаботится о себе, а если он этого не делает, то грош цена такому классу.
Так в примере и описывается реализация класса, который выступает как обертка над стандартными сокетами. И вопрос именно в том, как сделать так, чтобы этот класс смог о себе позаботиться сам.

Цитата:
Сообщение от Croessmah Посмотреть сообщение
Коротко - исключения никогда не должны вылетать из деструктора.
Мало того, в новых стандартах деструкторы по дефолту являются noexcept,
соответственно, если вылетит исключение, то будет вызван std::terminate,
который приведет (по дефолту) к вызову std::abort и приложение, фактически, аварийно завершится.
Не должны, знаю. Но вопрос то именно в том, что деструктор должен с ними делать, если вдруг они произойдут?
В планах порабощение вселенной...

Последний раз редактировалось zumm; 21.06.2016 в 21:35.
zumm вне форума Ответить с цитированием
Старый 21.06.2016, 21:38   #14
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Так где утечки-то? Откуда они возьмутся?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 21.06.2016, 21:41   #15
zumm
БохЪ
Форумчанин
 
Аватар для zumm
 
Регистрация: 30.09.2009
Сообщений: 724
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Так где утечки-то? Откуда они возьмутся?
Так у нас исключение в деструторе произошло. Единственный способ не выпустить его наружу и продолжить работать - проигнорировать исключение. А значит память не будет освобождена.

На примере из первого поста в теме: close не вызван, сокет не убит, память утекла.
В планах порабощение вселенной...
zumm вне форума Ответить с цитированием
Старый 21.06.2016, 22:03   #16
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Какое именно исключение у вас может выпасть?

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

Про наличие утечки зависит от причины ошибки/исключения. Может быть освобождать и нечего раз он не смог?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 21.06.2016, 23:02   #17
zumm
БохЪ
Форумчанин
 
Аватар для zumm
 
Регистрация: 30.09.2009
Сообщений: 724
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Какое именно исключение у вас может выпасть?

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

Про наличие утечки зависит от причины ошибки/исключения. Может быть освобождать и нечего раз он не смог?
Конечно же такие простые случаи как повторное закрытие (неверный хэндл сокета) и сбой close из-за прерывания под linux мы можем легко обработать: в первом случае со спокойной душой проигнорировать исключение, во втором попытаться закрыть сокет повторно.

Но вот нам делать, если, к примеру, при попытке закрытия сокета нам говорят, что он занят? Подождать? А сколько подождать? И есть ли у нас вообще право ждать?
В планах порабощение вселенной...
zumm вне форума Ответить с цитированием
Старый 22.06.2016, 01:07   #18
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Цитата:
Сообщение от zumm Посмотреть сообщение
при попытке закрытия сокета нам говорят, что он занят
Это как?!
waleri вне форума Ответить с цитированием
Старый 22.06.2016, 10:02   #19
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Цитата:
Но вопрос то именно в том, что деструктор должен с ними делать, если вдруг они произойдут?
В каждом отдельном случае - решать отдельно.
Croessmah вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Исключения c# CROWN C# (си шарп) 3 21.12.2014 18:29
Исключения в Qt iukash Qt и кроссплатформенное программирование С/С++ 6 16.04.2011 18:54
Исключения C++ Impuls1989 Помощь студентам 2 04.03.2011 00:51
Исключения yurik1982 Фриланс 9 16.02.2010 00:34
Исключения Rifler Общие вопросы Delphi 5 12.11.2008 00:29