Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.85/75: Рейтинг темы: голосов - 75, средняя оценка - 4.85
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
1

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

11.07.2013, 17:16. Показов 14655. Ответов 44
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всегда интересовало, зачем существуют эти методы? Допустим, есть некоторый объект класса и в коде видим:
C++
1
2
3
4
5
x = new myClass();
x.init();
...
x.dispose();
delete x;
Одно дело, если бы в эти методы передавались параметры, а другое дело это. Разве не проще было бы весь код init поместить в конструктор, а dispose, соответственно, в деструктор?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.07.2013, 17:16
Ответы с готовыми решениями:

Методы у JInternalFrame: setClosed(true); dispose();
Проблема следующая: по нажатию на кнопку создается окно JInternalFrame win = new...

Методы Dispose и Close для Stream
Здравствуйте! На сайте msdn есть пример на переопределение стандартного потока и возврат его в...

Это правда, что Close() и Clear() методы в .NET классах вызывают Dispose()?
Всем привет. Подскажите, пожалуйста: 1) Это правда, что Close() и Clear() методы в .NET классах...

Ошибка при загрузке Ubuntu 14.04 LTS: run-init: /sbin/init: Permission denied
Здравствуйте! На компьютере установлена Uuntu 14.04 LTS (64 bit). После установки cups (для...

44
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
11.07.2013, 17:23 2
О-хо-хо.... Чувствую, что код древний, как окаменевшие экскременты мамонта. Дай угадаю: Turbo Vision для C++? Так этот TV и был переводом с паскалевского TV - в котором как раз и были методы Init (конструктор) и Dispose (деструктор).
Короче, забудь. С тех пор прошло уж 20 лет. Мир изменился.
1
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
11.07.2013, 17:25 3
Да это вы у разработчиков либы спрашивайте.

Я лишь могу предположить что init() и dispose() возвращают коды ошибки если такая возникла при их выполнении.
1
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
11.07.2013, 17:29  [ТС] 4
CheshireCat, да нет, по прежнему вижу подобное периодически. В последний раз замечал в каком-то там классе при программировании на android. Да и в directX вроде было нечто подобное, а там явно не дураки сидят. Наверное всё так, как сказала avazart.
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
11.07.2013, 17:39 5
Согласен, ннооо.... тогда вот контрольный вопрос (в голову :-) ):
- что будет, если разработчик случайно (ну, где-нибудь глубоко во вложенном if()) забудет вызвать dispose() ? Останутся какие-то неосвобожденные ресурсы или что-то подобное? А если dispose() не будет вызван в результате раскрутки стека при выбросе исключения? Ась?
- что будет, если разработчик случайно же забудет вызвать init() ? Появится недоделанный объект? И как он будет существовать дальше? А что произойдет, если init() не был вызван, а к объекту применяется dispose() ?
1
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
11.07.2013, 17:49 6
Цитата Сообщение от nexen Посмотреть сообщение
в каком-то там классе при программировании на android.
Ознакомьтесь http://en.wikipedia.org/wiki/Dispose_pattern
2
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
11.07.2013, 17:50 7
Да, насчет "кодов ошибок":
C++ позволяет проигнорировать коды ошибок. В приведенном коде - никакого анализа и обработки кодов ошибок и нет.
0
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
11.07.2013, 18:03  [ТС] 8
Tulosba, а разве x = null не вызывает практически сразу сборку мусора? Ведь, фактически, dispose()-метод заставляет языки с GC следить за памятью так же, как программистам С++: им dispose(), нам delete.
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
11.07.2013, 18:07 9
Цитата Сообщение от CheshireCat Посмотреть сообщение
C++ позволяет проигнорировать коды ошибок. В приведенном коде - никакого анализа и обработки кодов ошибок и нет.
В приведенном нет, а вообще может быть.
Иначе как по другому организовать обработку ошибок ? Кидать исключения в конструкторе и деструкторе ?
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
11.07.2013, 18:20 10
Avazart, В конструкторе - да. В деструкторе - нет.
0
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
11.07.2013, 18:22  [ТС] 11
ForEveR, эм, разве в конструкторе можно кидать исключения? Имею ввиду, разве это безопасно? :0 Просто я уже как-то об этом спрашивал, меня тапками закидали
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
11.07.2013, 18:24 12
nexen, В конструторе да. В деструкторе нет. Хотя, все зависит от того, что подразумевается под словом "безопасность".
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
11.07.2013, 18:25 13
Цитата Сообщение от ForEveR Посмотреть сообщение
Avazart, В конструкторе - да. В деструкторе - нет.
Что делать с ошибкой при уничтожении ?
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
11.07.2013, 18:26 14
Avazart, Всмысле? Попробуйте-ка создать std::string от nullptr.
https://ideone.com/47T8J4
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
11.07.2013, 18:30 15
Цитата Сообщение от ForEveR Посмотреть сообщение
Avazart, Всмысле? Попробуйте-ка создать std::string от nullptr.
https://ideone.com/47T8J4
Имею ввиду смысл кода который занимает ресурсы в конструкторе, а освобождать его приходится методом, а не деструктором
(что бы отловить ошибку при освобождении).
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
11.07.2013, 18:33 16
Avazart, Ошибка при уничтожении происходить не должна, если происходит ошибка при уничтожении - мы должны
1) Обработать исключение, не выпустив его за границы деструктора.
2) Возможно записать что-то в лог/отправить e-mail разработчикам/что-то еще и либо проигнорировать, либо завершить работу приложения.

А на тему метода: смысла в этом довольно мало, в языках типа C#/Python это вполне себе ОК практика, ибо сборка мусора, ибо finally.
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
11.07.2013, 18:37 17
К примеру пытался недавно написать обвёрку под конкретную задачу для SQLite, и поначалу не учёл что закрытие БД может возвращать ошибку

https://www.cyberforum.ru/post4811497.html

Цитата Сообщение от ForEveR Посмотреть сообщение
1) Обработать исключение, не выпустив его за границы деструктора.
2) Возможно записать что-то в лог/отправить e-mail разработчикам/что-то еще и либо проигнорировать, либо завершить работу приложения.
Хм а как это будет выглядеть ? Добавлять в класс указатель на объект лога ?
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
11.07.2013, 18:42 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());
   }
}
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
11.07.2013, 18:55 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() ( с кодами возврата или исключениями не важно )
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
11.07.2013, 19:12 20
Avazart, Каждому свое. Конечно валить приложение не всегда стоит. И не всегда стоит использовать лог. Да и куча еще всяких "не" и нюансов.
0
11.07.2013, 19:12
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.07.2013, 19:12
Помогаю со студенческими работами здесь

Виртуальные методы(теория)
Здравствуйте уважаемые форумчане! В ходе обучения языку с++ возник вопрос непонимания назначения...

Теория и методы структурного программирования
Теория и методы структурного программирования

Функция init
В Prelude нашел два способа задания функции init: init = init (x:xs) = x : init xs init = ...

Init = function
Всем привет я новичок и изучаю javascript. Помогите понять что значит инициализация - Init и точка...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru