187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
|
||||||
1 | ||||||
Методы init() и dispose() - теория11.07.2013, 17:16. Показов 14655. Ответов 44
Метки нет (Все метки)
Всегда интересовало, зачем существуют эти методы? Допустим, есть некоторый объект класса и в коде видим:
0
|
11.07.2013, 17:16 | |
Ответы с готовыми решениями:
44
Методы у JInternalFrame: setClosed(true); dispose(); Методы Dispose и Close для Stream Это правда, что Close() и Clear() методы в .NET классах вызывают Dispose()? Ошибка при загрузке Ubuntu 14.04 LTS: run-init: /sbin/init: Permission denied |
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
|
|
11.07.2013, 17:23 | 2 |
О-хо-хо.... Чувствую, что код древний, как окаменевшие экскременты мамонта. Дай угадаю: Turbo Vision для C++? Так этот TV и был переводом с паскалевского TV - в котором как раз и были методы Init (конструктор) и Dispose (деструктор).
Короче, забудь. С тех пор прошло уж 20 лет. Мир изменился.
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 |
Ознакомьтесь 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
|
В астрале
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
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
11.07.2013, 18:26 | 14 |
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
|
11.07.2013, 18:37 | 17 |
К примеру пытался недавно написать обвёрку под конкретную задачу для SQLite, и поначалу не учёл что закрытие БД может возвращать ошибку
https://www.cyberforum.ru/post4811497.html Хм а как это будет выглядеть ? Добавлять в класс указатель на объект лога ?
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
||||||
11.07.2013, 18:42 | 18 | |||||
Avazart, Зависит от стратегии выбранной для логирования и так далее. Примитивно как-то так
0
|
11.07.2013, 18:55 | 19 |
Ну валить приложение по моему из-за одного объекта не всегда допустимо.
Добавлено через 1 минуту Ну связывать классы лога и класса-обвертки тоже на мой взгляд выглядит не ахти... Ибо логов может быть много они могу меняться в процессе разработки итп, и если разработчику приложения ( не класса-обвертки) приходится лезть и править каждый раз обвертку - это ой как не хорошо. Уж лучше стратегия подобная Си с методами Open() / Close() ( с кодами возврата или исключениями не важно )
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
11.07.2013, 19:12 | 20 |
Avazart, Каждому свое. Конечно валить приложение не всегда стоит. И не всегда стоит использовать лог. Да и куча еще всяких "не" и нюансов.
0
|
11.07.2013, 19:12 | |
11.07.2013, 19:12 | |
Помогаю со студенческими работами здесь
20
Виртуальные методы(теория) Теория и методы структурного программирования Функция init Init = function Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |