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

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

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

Студворк — интернет-сервис помощи студентам
Всегда интересовало, зачем существуют эти методы? Допустим, есть некоторый объект класса и в коде видим:
C++
1
2
3
4
5
x = new myClass();
x.init();
...
x.dispose();
delete x;
Одно дело, если бы в эти методы передавались параметры, а другое дело это. Разве не проще было бы весь код init поместить в конструктор, а dispose, соответственно, в деструктор?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.07.2013, 17:16
Ответы с готовыми решениями:

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

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

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

44
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
12.07.2013, 09:53
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от nexen Посмотреть сообщение
а разве x = null не вызывает практически сразу сборку мусора?
Время вызова сборщика мусора в общем случае не детерминировано. А иногда важный ресурс нужно освободить как можно раньше (например закрыть файл сразу как закончили в него писать, а не ждать пока сборщик мусора до него доберется и вызовет Finalize()), поэтому и придумали подход с Dispose().
2
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
12.07.2013, 21:33
А ещё init() и dispose() нужны, когда вам надо создать объект в "другом мире" (с помощью конструкторов какой-нибудь динамической библиотеки, или вообще другого процесса). Когда "местные" operator new() и operator delete() не подходят.
0
545 / 344 / 12
Регистрация: 05.11.2010
Сообщений: 1,076
Записей в блоге: 1
13.07.2013, 13:00
Цитата Сообщение от 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 блоке не вылетит еще одно исключение?
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
13.07.2013, 13:02
Цитата Сообщение от Герц Посмотреть сообщение
Плохой вариант, где гарантии что в Catch блоке не вылетит еще одно исключение?
Ну так в try больше ничего другого нет...
1
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
13.07.2013, 13:23
Цитата Сообщение от Герц Посмотреть сообщение
Плохой вариант, где гарантии что в Catch блоке не вылетит еще одно исключение?
Нигде. Если сломалось (локально расположнное) логгирование, то это уже проблемы вышележащего кода, что с этим делать.
2
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
13.07.2013, 15:04
В средах с gc применение Dispose() нормальная практика. Интересно, действительно подумать, а как это в С++.)
Поразмыслив пришла мысль, а что если вопрос применения таких методов, - может быть и вопросом времени? Смотрите, стоит только не высказать глупость, как тут же её никто и не опровергнет. То есть налицо потеря времени!
Придётся, высказаться. Предположим есть класс с набором "тяжелых" полей, для которых применяется отложенная (ленивая инициализация). То есть конструктор не проводит их инициализацию, а необходимые вычисления осуществляют методы доступа при первом обращении. Тогда, если есть группа объектов, для которых точно потребуется полная инициализация, а участок кода в которых они задействованы должен выполниться максимально быстро, то можно принудительно инициализировать их в специальном методе, до вхождения в данный блок кода.
Пользуясь той же логикой, Dispose(), - дополнительный метод выполняющий принудительное освобождение, не проверяя занят ли ресурс (если проверка требует времени). Это быстро и... если пользователь применит не там, где нужно, - получит исключение и опомнится. Что касается вопросов типа: - "А что если?!", то всегда можно спросить: - "А вдруг кто-то дважды применит delete?" Последнее, конечно дискуссионный вопрос.
0
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
13.07.2013, 15:15
Цитата Сообщение от IGPIGP Посмотреть сообщение
В средах с gc применение Dispose() нормальная практика. Интересно, действительно подумать, а как это в С++.)
В Си++ есть RAII.
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
13.07.2013, 15:48
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
В Си++ есть RAII.
Dispose() можно использовать чтобы побудить gc... RAII помогает автоматически удалять объекты при выходе из видимости. В том числе при применении smart-указателей. Неужели применение Dispose() может побудить систему освободиться от динамического объекта с доступом через такой указатель (ссылок на который уже нет, разумеется) ещё в пределах области?
0
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
13.07.2013, 17:18
Нет, Dispose (в CLR) — это метод, освобождающий все unmanaged-ресурсы, которыми владеет объект (открытые файлы, разделяемую память и всё такое), чтобы после этого остались только managed-ресурсы, которые подчистит уже GC. Это не подсказка GC: "А ну быстро отдал мне память, занимаемую этим объектом", и объект после вызова этого метода не находится в неопределённом состоянии. Он просто позакрывал всякие хендлы, но в принципе ещё никуда не делся.
2
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
13.07.2013, 17:28
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
Нет, Dispose (в CLR) — это метод, освобождающий все unmanaged-ресурсы, которыми владеет объект (открытые файлы, разделяемую память и всё такое), чтобы после этого остались только managed-ресурсы, которые подчистит уже GC.
С неуправляемыми ресурсами понятно. Хотя можно их и руками освободить где-то ещё. Пусть есть класс управляемый из управляемого. Я не утверждаю, что Dispose() принуждает gc освободить ресурсы, но как правило, он слушается. По моим наблюдениям.
В С++ это же не ключевое слово. В С тоже. Там Init() использовали для инициализации структур, как стиль. Назвать можно бы как угодно. Вопрос же в том есть ли сейчас этому применение?
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
13.07.2013, 17:31
Цитата Сообщение от IGPIGP Посмотреть сообщение
Там Init() использовали для инициализации структур, как стиль.
Там это где ? В какой библиотеке или коде?
Может это просто изврат данного конкретного разработчика.

Как вроде подчеркнули зависит от назначения кода и вкуса ...
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
13.07.2013, 17:40
Цитата Сообщение от Avazart Посмотреть сообщение
А то чет я такого не замечал.
Да и в книгах по С++, встречается, когда говорят о С и структурах, приводят примеры. Это вопрос кто как привык. Кому-то нравится много отдельных функций и он постоянно заботится о порядке их вызова (если надо) при инициализации экземпляра структуры, а кто-то собирает в один метод. Вопрос как его назвать, тоже сложная нравственная дилемма... Я встречал init() и Init() и initialise() даже кажется. Если вопрос где, интересен, - пороюсь. Хотя не может быть, что бы это только мне привелось видеть.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
13.07.2013, 17:54
Так где вы такую литературу С++ надыбали ?

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

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

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

Добавлено через 6 минут
Если же вы плодите куча методов и они дают больше возможностей чем затребовано, то скорее всего вы нарушаете инкапсуляцию.
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,538
Записей в блоге: 1
13.07.2013, 18:29
Цитата Сообщение от Avazart Посмотреть сообщение
Обычно все решается в конструкторе
В языке Си нету конструкторов
Цитата Сообщение от Avazart Посмотреть сообщение
Так где вы такую литературу С++ надыбали ?
У Б.Эккеля видел нечто подобное. Там он обосновывал необходимость конструкторов. изначально приводя примеры, как это выглядело бы на Си, до того, как изучены классы.
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
13.07.2013, 18:46
Цитата Сообщение от 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
//-------------------------------------------------------------------------------------
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
13.07.2013, 19:24
Цитата Сообщение от IGPIGP Посмотреть сообщение
. Страуструп
Язык программирования С++. Специальное издание.
Москва, БИНОМ, 2011г.
стр. 284, 285
Глава какая, а то чет не сходится.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
13.07.2013, 19:27
Цитата Сообщение от Avazart Посмотреть сообщение
Глава какая, а то чет не сходится.
10.2.1 Функции-члены
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
13.07.2013, 19:30


Где ?

Дальше на страницах тоже нет, может издание не то ( год выпуска не знаю )
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,538
Записей в блоге: 1
13.07.2013, 19:32
Цитата Сообщение от Avazart Посмотреть сообщение
Где ?
а где тут где стр. 284, 285 ?
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
13.07.2013, 19:36
Листаем назад, на стр. 272 читаем :
Миниатюры
Методы init() и dispose() - теория  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.07.2013, 19:36

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
28. КОнкретное развертывание плана номер 1 из поста номер 27
anaschu 22.06.2026
Можно ли из модели получить конкретные строительные требования? Честно — напрямую из текущей модели такие ответы не получить. Но цепочка логики есть, и она не такая длинная. Где разрыв . . .
27. Планы на разработку функциональных требований к строительству внутри модели пищеблока (или не только его?)
anaschu 22.06.2026
Что уже реализовано и даёт конфликты «бесплатно» Самый простой конфликт уже работает — конфликт за ресурс-работника. Заданий больше, чем доступных поваров → очередь в queue1. Это прямое отражение. . .
26. мед мат модель.Какие типы конфликтов функциональных требований можно рассчитать через ДЕС-моделирование (СМО) в AnyLogic?
anaschu 22.06.2026
Что ДЕС/ СМО умеет считать напрямую: Конфликты за ресурсы (очереди, узкие места). Несколько типов агентов (повара, учителя, рабочие, пациенты) претендуют на один ресурс (лифт, вход, коридор,. . .
25 модель здравосохранения и функциональных требований к пищеблоку: конфликты функциональных требований.
anaschu 22.06.2026
Есть ли данные о том, какие функциональные/ эксплуатационные требования или их сочетания труднее всего учитывать при проектировании зданий? Да, такие данные есть, и они хорошо описаны и в российской,. . .
Remote Connection Manager
DevAlt 21.06.2026
Написал для себя небольшую прилагу: https:/ / github. com/ altbodhi/ ReConMan По итогу пришел к мысли, что DU не дружат с существующими технологиями. От сериализации до отображения в реляционную. . .
Администрация Хабра удаляет новые энрегоэфективные алгоритмы, которые не западной школы кода, и вовсе никак не сгенерировавны.
Hrethgir 20.06.2026
Делается это, как замечено, при правках - при объявлении концептуальных отличий в алгоримах. Делается это, по линейке событий - после дополнения публикации основными отличиями от основных западных. . .
Процесс ориентированная диалектика (не новость - просто системное обновление, философия).
Hrethgir 20.06.2026
Однажды один участник в своём блоге, на этом форуме, сделал запись "О языках замолвите слово". Понимая, что язык - важная вещь, я решил хорошо подумать, прежде чем сказать, и сказал то, что вы видите. . .
Контроль уникальности строк в табличной части документа
Maks 18.06.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ПланированиеСпецтехники" с табличной частью "НаличиеОборудования", разработанного в КА2. Задача: контроль уникальности строк в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru