Форум программистов, компьютерный форум CyberForum.ru

Методы init() и dispose() - теория - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.69
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
11.07.2013, 17:16     Методы init() и dispose() - теория #1
Всегда интересовало, зачем существуют эти методы? Допустим, есть некоторый объект класса и в коде видим:
C++
1
2
3
4
5
x = new myClass();
x.init();
...
x.dispose();
delete x;
Одно дело, если бы в эти методы передавались параметры, а другое дело это. Разве не проще было бы весь код init поместить в конструктор, а dispose, соответственно, в деструктор?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
11.07.2013, 17:23     Методы init() и dispose() - теория #2
О-хо-хо.... Чувствую, что код древний, как окаменевшие экскременты мамонта. Дай угадаю: Turbo Vision для C++? Так этот TV и был переводом с паскалевского TV - в котором как раз и были методы Init (конструктор) и Dispose (деструктор).
Короче, забудь. С тех пор прошло уж 20 лет. Мир изменился.
Avazart
 Аватар для Avazart
6900 / 5140 / 252
Регистрация: 10.12.2010
Сообщений: 22,591
Записей в блоге: 17
11.07.2013, 17:25     Методы init() и dispose() - теория #3
Да это вы у разработчиков либы спрашивайте.

Я лишь могу предположить что init() и dispose() возвращают коды ошибки если такая возникла при их выполнении.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
11.07.2013, 17:29  [ТС]     Методы init() и dispose() - теория #4
CheshireCat, да нет, по прежнему вижу подобное периодически. В последний раз замечал в каком-то там классе при программировании на android. Да и в directX вроде было нечто подобное, а там явно не дураки сидят. Наверное всё так, как сказала avazart.
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
11.07.2013, 17:39     Методы init() и dispose() - теория #5
Согласен, ннооо.... тогда вот контрольный вопрос (в голову :-) ):
- что будет, если разработчик случайно (ну, где-нибудь глубоко во вложенном if()) забудет вызвать dispose() ? Останутся какие-то неосвобожденные ресурсы или что-то подобное? А если dispose() не будет вызван в результате раскрутки стека при выбросе исключения? Ась?
- что будет, если разработчик случайно же забудет вызвать init() ? Появится недоделанный объект? И как он будет существовать дальше? А что произойдет, если init() не был вызван, а к объекту применяется dispose() ?
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
11.07.2013, 17:49     Методы init() и dispose() - теория #6
Цитата Сообщение от nexen Посмотреть сообщение
в каком-то там классе при программировании на android.
Ознакомьтесь http://en.wikipedia.org/wiki/Dispose_pattern
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
11.07.2013, 17:50     Методы init() и dispose() - теория #7
Да, насчет "кодов ошибок":
C++ позволяет проигнорировать коды ошибок. В приведенном коде - никакого анализа и обработки кодов ошибок и нет.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
11.07.2013, 18:03  [ТС]     Методы init() и dispose() - теория #8
Tulosba, а разве x = null не вызывает практически сразу сборку мусора? Ведь, фактически, dispose()-метод заставляет языки с GC следить за памятью так же, как программистам С++: им dispose(), нам delete.
Avazart
 Аватар для Avazart
6900 / 5140 / 252
Регистрация: 10.12.2010
Сообщений: 22,591
Записей в блоге: 17
11.07.2013, 18:07     Методы init() и dispose() - теория #9
Цитата Сообщение от CheshireCat Посмотреть сообщение
C++ позволяет проигнорировать коды ошибок. В приведенном коде - никакого анализа и обработки кодов ошибок и нет.
В приведенном нет, а вообще может быть.
Иначе как по другому организовать обработку ошибок ? Кидать исключения в конструкторе и деструкторе ?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
11.07.2013, 18:20     Методы init() и dispose() - теория #10
Avazart, В конструкторе - да. В деструкторе - нет.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
11.07.2013, 18:22  [ТС]     Методы init() и dispose() - теория #11
ForEveR, эм, разве в конструкторе можно кидать исключения? Имею ввиду, разве это безопасно? :0 Просто я уже как-то об этом спрашивал, меня тапками закидали
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
11.07.2013, 18:24     Методы init() и dispose() - теория #12
nexen, В конструторе да. В деструкторе нет. Хотя, все зависит от того, что подразумевается под словом "безопасность".
Avazart
 Аватар для Avazart
6900 / 5140 / 252
Регистрация: 10.12.2010
Сообщений: 22,591
Записей в блоге: 17
11.07.2013, 18:25     Методы init() и dispose() - теория #13
Цитата Сообщение от ForEveR Посмотреть сообщение
Avazart, В конструкторе - да. В деструкторе - нет.
Что делать с ошибкой при уничтожении ?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
11.07.2013, 18:26     Методы init() и dispose() - теория #14
Avazart, Всмысле? Попробуйте-ка создать std::string от nullptr.
https://ideone.com/47T8J4
Avazart
 Аватар для Avazart
6900 / 5140 / 252
Регистрация: 10.12.2010
Сообщений: 22,591
Записей в блоге: 17
11.07.2013, 18:30     Методы init() и dispose() - теория #15
Цитата Сообщение от ForEveR Посмотреть сообщение
Avazart, Всмысле? Попробуйте-ка создать std::string от nullptr.
https://ideone.com/47T8J4
Имею ввиду смысл кода который занимает ресурсы в конструкторе, а освобождать его приходится методом, а не деструктором
(что бы отловить ошибку при освобождении).
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
11.07.2013, 18:33     Методы init() и dispose() - теория #16
Avazart, Ошибка при уничтожении происходить не должна, если происходит ошибка при уничтожении - мы должны
1) Обработать исключение, не выпустив его за границы деструктора.
2) Возможно записать что-то в лог/отправить e-mail разработчикам/что-то еще и либо проигнорировать, либо завершить работу приложения.

А на тему метода: смысла в этом довольно мало, в языках типа C#/Python это вполне себе ОК практика, ибо сборка мусора, ибо finally.
Avazart
 Аватар для Avazart
6900 / 5140 / 252
Регистрация: 10.12.2010
Сообщений: 22,591
Записей в блоге: 17
11.07.2013, 18:37     Методы init() и dispose() - теория #17
К примеру пытался недавно написать обвёрку под конкретную задачу для SQLite, и поначалу не учёл что закрытие БД может возвращать ошибку

SQLite Блокровка/разблокировка

Цитата Сообщение от ForEveR Посмотреть сообщение
1) Обработать исключение, не выпустив его за границы деструктора.
2) Возможно записать что-то в лог/отправить e-mail разработчикам/что-то еще и либо проигнорировать, либо завершить работу приложения.
Хм а как это будет выглядеть ? Добавлять в класс указатель на объект лога ?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
11.07.2013, 18:42     Методы init() и dispose() - теория #18
Avazart, Зависит от стратегии выбранной для логирования и так далее. Примитивно как-то так

C++
1
2
3
4
5
6
7
8
9
10
11
12
~Class()
{
   try
   {
       free_resources();
   }
   catch (const std::exception& e)
   {
       // write and ignore exception
       log::instance().write(e.what());
   }
}
Avazart
 Аватар для Avazart
6900 / 5140 / 252
Регистрация: 10.12.2010
Сообщений: 22,591
Записей в блоге: 17
11.07.2013, 18:55     Методы init() и dispose() - теория #19
Цитата Сообщение от ForEveR Посмотреть сообщение
либо завершить работу приложения.
Ну валить приложение по моему из-за одного объекта не всегда допустимо.

Добавлено через 1 минуту
Цитата Сообщение от ForEveR Посмотреть сообщение
Avazart, Зависит от стратегии выбранной для логирования и так далее. Примитивно как-то так


C++
1
2
3
4
5
6
7
8
9
10
11
12
~Class()
{
 try
 {
 free_resources();
 }
 catch (const std::exception& e)
 {
 // write and ignore exception
 log::instance().write(e.what());
 }
}
Ну связывать классы лога и класса-обвертки тоже на мой взгляд выглядит не ахти...
Ибо логов может быть много они могу меняться в процессе разработки итп, и если разработчику приложения ( не класса-обвертки)
приходится лезть и править каждый раз обвертку - это ой как не хорошо.

Уж лучше стратегия подобная Си с методами Open() / Close() ( с кодами возврата или исключениями не важно )
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.07.2013, 19:12     Методы init() и dispose() - теория
Еще ссылки по теме:

Что делает оператор init в данной ситуации (работа с двумерными массивами) C++
Теория по С++ C++
C++ No init for const!

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

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
11.07.2013, 19:12     Методы init() и dispose() - теория #20
Avazart, Каждому свое. Конечно валить приложение не всегда стоит. И не всегда стоит использовать лог. Да и куча еще всяких "не" и нюансов.
Yandex
Объявления
11.07.2013, 19:12     Методы init() и dispose() - теория
Ответ Создать тему
Опции темы

Текущее время: 00:14. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru