Форум программистов, компьютерный форум 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, соответственно, в деструктор?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
12.07.2013, 09:53     Методы init() и dispose() - теория #21
Цитата Сообщение от nexen Посмотреть сообщение
а разве x = null не вызывает практически сразу сборку мусора?
Время вызова сборщика мусора в общем случае не детерминировано. А иногда важный ресурс нужно освободить как можно раньше (например закрыть файл сразу как закончили в него писать, а не ждать пока сборщик мусора до него доберется и вызовет Finalize()), поэтому и придумали подход с Dispose().
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
12.07.2013, 21:33     Методы init() и dispose() - теория #22
А ещё init() и dispose() нужны, когда вам надо создать объект в "другом мире" (с помощью конструкторов какой-нибудь динамической библиотеки, или вообще другого процесса). Когда "местные" operator new() и operator delete() не подходят.
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
13.07.2013, 13:00     Методы init() и dispose() - теория #23
Цитата Сообщение от 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());
   }
}
Плохой вариант, где гарантии что в Catch блоке не вылетит еще одно исключение?
Avazart
 Аватар для Avazart
6900 / 5140 / 252
Регистрация: 10.12.2010
Сообщений: 22,591
Записей в блоге: 17
13.07.2013, 13:02     Методы init() и dispose() - теория #24
Цитата Сообщение от Герц Посмотреть сообщение
Плохой вариант, где гарантии что в Catch блоке не вылетит еще одно исключение?
Ну так в try больше ничего другого нет...
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
13.07.2013, 13:23     Методы init() и dispose() - теория #25
Цитата Сообщение от Герц Посмотреть сообщение
Плохой вариант, где гарантии что в Catch блоке не вылетит еще одно исключение?
Нигде. Если сломалось (локально расположнное) логгирование, то это уже проблемы вышележащего кода, что с этим делать.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6171 / 2900 / 283
Регистрация: 04.12.2011
Сообщений: 7,710
Записей в блоге: 3
13.07.2013, 15:04     Методы init() и dispose() - теория #26
В средах с gc применение Dispose() нормальная практика. Интересно, действительно подумать, а как это в С++.)
Поразмыслив пришла мысль, а что если вопрос применения таких методов, - может быть и вопросом времени? Смотрите, стоит только не высказать глупость, как тут же её никто и не опровергнет. То есть налицо потеря времени!
Придётся, высказаться. Предположим есть класс с набором "тяжелых" полей, для которых применяется отложенная (ленивая инициализация). То есть конструктор не проводит их инициализацию, а необходимые вычисления осуществляют методы доступа при первом обращении. Тогда, если есть группа объектов, для которых точно потребуется полная инициализация, а участок кода в которых они задействованы должен выполниться максимально быстро, то можно принудительно инициализировать их в специальном методе, до вхождения в данный блок кода.
Пользуясь той же логикой, Dispose(), - дополнительный метод выполняющий принудительное освобождение, не проверяя занят ли ресурс (если проверка требует времени). Это быстро и... если пользователь применит не там, где нужно, - получит исключение и опомнится. Что касается вопросов типа: - "А что если?!", то всегда можно спросить: - "А вдруг кто-то дважды применит delete?" Последнее, конечно дискуссионный вопрос.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
13.07.2013, 15:15     Методы init() и dispose() - теория #27
Цитата Сообщение от IGPIGP Посмотреть сообщение
В средах с gc применение Dispose() нормальная практика. Интересно, действительно подумать, а как это в С++.)
В Си++ есть RAII.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6171 / 2900 / 283
Регистрация: 04.12.2011
Сообщений: 7,710
Записей в блоге: 3
13.07.2013, 15:48     Методы init() и dispose() - теория #28
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
В Си++ есть RAII.
Dispose() можно использовать чтобы побудить gc... RAII помогает автоматически удалять объекты при выходе из видимости. В том числе при применении smart-указателей. Неужели применение Dispose() может побудить систему освободиться от динамического объекта с доступом через такой указатель (ссылок на который уже нет, разумеется) ещё в пределах области?
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
13.07.2013, 17:18     Методы init() и dispose() - теория #29
Нет, Dispose (в CLR) — это метод, освобождающий все unmanaged-ресурсы, которыми владеет объект (открытые файлы, разделяемую память и всё такое), чтобы после этого остались только managed-ресурсы, которые подчистит уже GC. Это не подсказка GC: "А ну быстро отдал мне память, занимаемую этим объектом", и объект после вызова этого метода не находится в неопределённом состоянии. Он просто позакрывал всякие хендлы, но в принципе ещё никуда не делся.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6171 / 2900 / 283
Регистрация: 04.12.2011
Сообщений: 7,710
Записей в блоге: 3
13.07.2013, 17:28     Методы init() и dispose() - теория #30
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
Нет, Dispose (в CLR) — это метод, освобождающий все unmanaged-ресурсы, которыми владеет объект (открытые файлы, разделяемую память и всё такое), чтобы после этого остались только managed-ресурсы, которые подчистит уже GC.
С неуправляемыми ресурсами понятно. Хотя можно их и руками освободить где-то ещё. Пусть есть класс управляемый из управляемого. Я не утверждаю, что Dispose() принуждает gc освободить ресурсы, но как правило, он слушается. По моим наблюдениям.
В С++ это же не ключевое слово. В С тоже. Там Init() использовали для инициализации структур, как стиль. Назвать можно бы как угодно. Вопрос же в том есть ли сейчас этому применение?
Avazart
 Аватар для Avazart
6900 / 5140 / 252
Регистрация: 10.12.2010
Сообщений: 22,591
Записей в блоге: 17
13.07.2013, 17:31     Методы init() и dispose() - теория #31
Цитата Сообщение от IGPIGP Посмотреть сообщение
Там Init() использовали для инициализации структур, как стиль.
Там это где ? В какой библиотеке или коде?
Может это просто изврат данного конкретного разработчика.

Как вроде подчеркнули зависит от назначения кода и вкуса ...
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6171 / 2900 / 283
Регистрация: 04.12.2011
Сообщений: 7,710
Записей в блоге: 3
13.07.2013, 17:40     Методы init() и dispose() - теория #32
Цитата Сообщение от Avazart Посмотреть сообщение
А то чет я такого не замечал.
Да и в книгах по С++, встречается, когда говорят о С и структурах, приводят примеры. Это вопрос кто как привык. Кому-то нравится много отдельных функций и он постоянно заботится о порядке их вызова (если надо) при инициализации экземпляра структуры, а кто-то собирает в один метод. Вопрос как его назвать, тоже сложная нравственная дилемма... Я встречал init() и Init() и initialise() даже кажется. Если вопрос где, интересен, - пороюсь. Хотя не может быть, что бы это только мне привелось видеть.
Avazart
 Аватар для Avazart
6900 / 5140 / 252
Регистрация: 10.12.2010
Сообщений: 22,591
Записей в блоге: 17
13.07.2013, 17:54     Методы init() и dispose() - теория #33
Так где вы такую литературу С++ надыбали ?

Обычно все решается в конструкторе, на то он и конструктор.
Но есть ситуации когда бывает нужно "переинициализировать" переменные например открыть другую базу данных ... ( закрыть старую, открыть новую ), например методом open(), но в таких случаях он в принципе дублирует конструктор(ы).

Разбиение/объединение в методы это вопрос назначения класса тут- удобство/возможности.

Чем больше методов больше возможностей и более гибко можно использовать класс (возможно, а возможно и нет), но он менее удобен в конкретной задаче: много методов- легко запутаться, тяжело читается в общем коде.

Добавлено через 6 минут
Если же вы плодите куча методов и они дают больше возможностей чем затребовано, то скорее всего вы нарушаете инкапсуляцию.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
13.07.2013, 18:29     Методы init() и dispose() - теория #34
Цитата Сообщение от Avazart Посмотреть сообщение
Обычно все решается в конструкторе
В языке Си нету конструкторов
Цитата Сообщение от Avazart Посмотреть сообщение
Так где вы такую литературу С++ надыбали ?
У Б.Эккеля видел нечто подобное. Там он обосновывал необходимость конструкторов. изначально приводя примеры, как это выглядело бы на Си, до того, как изучены классы.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6171 / 2900 / 283
Регистрация: 04.12.2011
Сообщений: 7,710
Записей в блоге: 3
13.07.2013, 18:46     Методы init() и dispose() - теория #35
Цитата Сообщение от Avazart Посмотреть сообщение
Так где вы такую литературу С++ надыбали ?
//------------------------------------------------------------------------------------
В.В. Лаптев
С++ Объектно-ориентированное программирование.
Изд-во Питер 2008г.
стр.26
C++
1
void Init( const long double& t = 0.0 ){//функция инициализации структуры Tmoney
//-------------------------------------------------------------------------------------
Б. Страуструп
Язык программирования С++. Специальное издание.
Москва, БИНОМ, 2011г.
стр. 284, 285
C++
1
void Date::init(int dd, int mm, int yy);//объявление метода инициализации структуры Date
//-------------------------------------------------------------------------------------
Avazart
 Аватар для Avazart
6900 / 5140 / 252
Регистрация: 10.12.2010
Сообщений: 22,591
Записей в блоге: 17
13.07.2013, 19:24     Методы init() и dispose() - теория #36
Цитата Сообщение от IGPIGP Посмотреть сообщение
. Страуструп
Язык программирования С++. Специальное издание.
Москва, БИНОМ, 2011г.
стр. 284, 285
Глава какая, а то чет не сходится.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6171 / 2900 / 283
Регистрация: 04.12.2011
Сообщений: 7,710
Записей в блоге: 3
13.07.2013, 19:27     Методы init() и dispose() - теория #37
Цитата Сообщение от Avazart Посмотреть сообщение
Глава какая, а то чет не сходится.
10.2.1 Функции-члены
Avazart
 Аватар для Avazart
6900 / 5140 / 252
Регистрация: 10.12.2010
Сообщений: 22,591
Записей в блоге: 17
13.07.2013, 19:30     Методы init() и dispose() - теория #38
Методы init() и dispose() - теория

Где ?

Дальше на страницах тоже нет, может издание не то ( год выпуска не знаю )
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
13.07.2013, 19:32     Методы init() и dispose() - теория #39
Цитата Сообщение от Avazart Посмотреть сообщение
Где ?
а где тут где стр. 284, 285 ?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.07.2013, 19:36     Методы init() и dispose() - теория
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Avazart
 Аватар для Avazart
6900 / 5140 / 252
Регистрация: 10.12.2010
Сообщений: 22,591
Записей в блоге: 17
13.07.2013, 19:36     Методы init() и dispose() - теория #40
Листаем назад, на стр. 272 читаем :
Миниатюры
Методы init() и dispose() - теория  
Yandex
Объявления
13.07.2013, 19:36     Методы init() и dispose() - теория
Ответ Создать тему
Опции темы

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