|
3 / 3 / 1
Регистрация: 11.03.2019
Сообщений: 42
|
|
Как уничтожить экземпляр класса (объект)?21.06.2019, 16:48. Показов 29926. Ответов 119
Я столкнул с такой проблемой. Я не могу понять как удалять объекты класса(экземляры). Читая интернет я вижу что "мусорщик" должен автоматически удалять те объекты, на которые нет указателя, но у меня это не работает. Подскажите как решить. Вот видео где всё показано, по нажатию кнопки в указатель записывается новый объект, но старый не удаляется, это видно по увеличению кол-ва оперативной памяти занимаемого приложением.
https://www.youtube.com/watch?... e=youtu.be Кликните здесь для просмотра всего текста
1
|
|
| 21.06.2019, 16:48 | |
|
Ответы с готовыми решениями:
119
Как в случае с Dependency Injection внедрять отдельный экземпляр некоторого класса только лишь для одного другого класса Как увидеть объект Session и объект Server из модуля класса? Как создать экземпляр класса по условию |
|
14346 / 9440 / 1358
Регистрация: 21.01.2016
Сообщений: 35,574
|
|||||||
| 24.06.2019, 06:49 | |||||||
|
Fulcrum_013, можете показать пример кода, где "инстанст" уничтожается вызовом метода Dispose? Я бы с удовольствием посмотрел. А так, получается, что вы несёте: Кликните здесь для просмотра всего текста
7
|
|||||||
|
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
|
|
| 25.06.2019, 16:46 | |
|
Usaga, При любом вызове метода Dispose. Его суть именно в уничтожении инстанса точно так же как и у деструтора. Т.е. буфер приводится в такое состояние когда то что в нем находится уже не является объектом в терминологии ООП - т.е. сущностью моделирующей объект предметной области, а соответственно память буфера сразу после этого пригодна для переиспользования. А тривиальный ли деструктор или нет, и безопасен ли его повторный вызов - это уже к делу вообще не относится и зависит от конкретного класса инстанса и деталей реализации.
Добавлено через 17 минут Usaga, Сядьте один раз и отделите котлет от мух. Вот к примеру что вы хотели показать этим куском быдлокода? Вы это в терминах ООП или других разделорв компьютерных наук объяснить можете? Не можете. Так что несете вы только всякую чушь ни о чем, абсолютно никак не пересекающуюся ни с обсуждаемой темой ни вообще с реальной действительностью. Еще раз - учите матчасть и не морочьте людям голову своими околовсяческими бреднями высосанными из мифологии ютуба.
0
|
|
|
14346 / 9440 / 1358
Регистрация: 21.01.2016
Сообщений: 35,574
|
|
| 25.06.2019, 17:35 | |
|
Fulcrum_013, я вам показал, что экземпляр объекта никак не страдает и не изменяется при вызове Dispose(). И ни вопроса ТС, ни ваш пассаж о Dispose() к предметной области не относится.
Метод Dispose() к удалению экземпляра класса не относится вообще никак.
0
|
|
|
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
|
|||||||||||
| 25.06.2019, 18:20 | |||||||||||
|
Usaga, Опять двойка. Инстанс после вызова деструктора, роль коего в нетах исполняет Dispose, считается несуществующим по правилам ООП. А как там оно реализовано в плане безопасности ловления граблей повторного доступа к обломкам которые остались в буфере к делу не относится.
пример.
Но факт того что инстанс уничтожен первым вызовом деструктора от этого не меняется. Точно так же и c Dispose с той разницей что у Dispose проверка уничожался ли инстанс ранее пишется вручную а в данном примере она под капотом operator delete[].
0
|
|||||||||||
|
|
||||
| 25.06.2019, 18:41 | ||||
|
Fulcrum_013, это троллинг какой-то?
Зато там есть интересное замечание:
А теперь в терминах компьютерных наук: В .NET используется Mark&Sweep(Compact) алгоритм сборки мусора. Про него можете почитать здесь (там как раз с гифками для самых маленьких). По сути уничтожение объекта с точки зрения ООП происходит в конце Mark фазы сборки мусора, когда граф живых инстансов уже построен, что значит, что остальная память уже не используется. На Sweep(Compact) фазе уже идет дефрагментация памяти (поколений) копированием живых инстансов из одной области в другую. Так что там с Dispose()? Еще раз - ничего. Dispose() никак к этому не относится, GC не проверятся и инстансы не уничтожается. Вы можете, для примера, задиспозить любой инстанс в статической переменной и он проживет до конца жизни приложения (AppDomain'а). Так что там с Finalize()? Тоже ничего, внезапно! Более того, managed объекты, зарегистрированные для финализации, проживут как минимум еще одну сборку мусора, для освобождения unmanaged ресурсов, прежде чем они уйдут в небытие.
2
|
||||
|
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,575
|
|
| 25.06.2019, 18:46 | |
|
Fulcrum_013, не позорились бы... Dispose в C# не является аналогом деструктора из C++. И даже Finalizer (так же часто называется деструктором) в C# не является полным аналогом деструктора C++, т.к. мы точно не знаем когда он будет вызван в отличие от деструктора C++ (deterministic destruction в С++ против nondeterministic destruction в C#).
А насчет метода Dispose интерфейса IDisposable, то всё что он может делать, это освобождать внешние unmanaged ресурсы, которые создатель класса прописал в метод Dispose и про которые GC соответственно не в курсе. Экземпляр класса он не уничтожает.
0
|
|
|
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
|
|
| 25.06.2019, 18:56 | |
|
Someone007, Это именно аналог деструктора. И задачи у него те же - разрушение инстанса. Причем это аналог паскалевского/дельфовского деструктора а не какого либо другого. GC никаким образом не автоматизирует работу по уничтожению инстансов вовремя. Он всего лишь управляет переиспользованием освобожденных буферов самым неэффективным способом.
0
|
|
|
|
|
| 25.06.2019, 19:07 | |
|
0
|
|
|
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
|
||||
| 25.06.2019, 19:25 | ||||
|
Рассматривать когда и как нужно произвести уничтожение инстанса нужно с точки зрения ООП потому что это сущность предметной области а не с точки зрения когда типа это делает GC. Потому что GC не предназначен для управления врменем жизни инстансов. Он управляет только памятью - т.е. решает задачу "найти кусок памяти для переиспользования" и не более того. При этом делает это наиболее неэффективным из известных сособом. А что в плане GC не умеет никому давно не интересно. Потому что в плане обеспечения правил ООП он не умеет вообще ничего и поэтому в профессиональных ооп языках GC вообще никогда не использовался. Только в экспериментальной симула-67 где и была выяснена его абсолютная непригодность для ООП. т.е. касательно исходной темы вопроса как принудительно удалить инстанс способ есть только один - использовать рукописный аналог паскалевского деструктора, коим является Dispose, для разрушения инстанса (высвобождения ресурсов и т.д.) и точно так же как в паскале вызывать его вручную там где нужно принудительно удалить объект. Разница с паскалем только в том что о переиспользовании буфер с обломками инстанса позаботится GC. Добавлено через 1 минуту Добавлено через 14 минут
0
|
||||
|
|
|
| 25.06.2019, 20:50 | |
|
Fulcrum_013, теперь я начинаю понимать ваши мысли.
Вы как-то взяли и размазали по всем уровням абстракции слово объект. + у вас нет понимания как работает CLR и GC конкретно в .NET. Не в симуле, не в лиспе, не где либо еще, а конкретно в .NET. Суть в том, что сборщики мусора бывают разные, фреймворки бывают разные и с разными границами ответственности. Касательно .Net - вы абсолютно не правы. Есть объект на уровне предметной области, время жизни которого ограничено композицией или клиентом породившим объект. Это вы написали и я с этим согласен. Есть объект на уровне кода. Например, new MyObject().DoSomething(). Время жизни которого ограничено областью видимости, или временем жизни агрегата или пока вы явно не уничтожите его (как ваш пример вне .Net) Есть объекты на уровне CLR (да-да, вполне себе объекты с полями и методами (объекты типа)), которыми и управляет GC, по которым он строит графы и которые он инициализирует в памяти. Итак, в нашей дискуссии есть 2 момента: 1: метод Dispose() (именно он, и никакой другой) не относится к времени жизни объекта по определению (никакого из вышеперечисленных). Это не деструктор, не его аналог в .Net - это всего лишь один единственный метод IDisposable интерфейса с одним единственным предназначением - освободить unmanaged ресурсы вместо финализатора. Всё. 2: Есть такая штука, как инверсия управления. Это есть отличительная черта (необходимое свойство) любого фреймворка (в том числе .Net). Вся суть в ней в том, чтобы отдать на откуп управление чем-либо (временем жизни, DB-соединениями, потоками и др.). Касательно .NET - фреймворк управляет временем жизни CLR-объектов полностью. Начиная от выделения памяти, заканчивая освобождения этой памяти для других объектов. Именно поэтому, специально, в .Net нет деструкторов и их аналогов, ибо мы отдаем управление созданием и удалением объектов в памяти CLR.
1
|
|
|
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
|
|
| 25.06.2019, 21:32 | |
|
Cupko, Все что вы перечислили относится к инстансу. Называть его объектом кстати так о птичках некорректно потому что на самом деле он то субъект. Путаницу здесь вносит именно то что как instance так и object переводится как объект. Только object при этом ни разу не соответсвует ручкоязычному термину объект в терминах ООП. ему соответсвует именно instance. и вот именно ими GC не управляет от слова совсем. термину же object используемому в описании яп гораздо более соответствует термин ресурс. И вот тогда все становится сразу понятно.
А от того где оно в лиспе нете или каком еще лисапете суть GC не поменяется. Это устаревший эмулятор аппаратного стека изобретенный для памяти на лентах и ничто другое. Ничем кроме высвободившихся буферов памяти он управлять не способен а тем более жизненным циклом и взаимосвязями инстансов. Потому что разрушение инстаса это такая же операция как и вызов любого метода, а равно и вносит изменения в среду, которые оказывают влияние на другие инстансы отслеживающие изменение среды. А соответственно такие действия не могут быть отложены до уборки которая может вообще не состоятся без произведения оных действий вовремя. Т.е. время жизни инстансов - это епархия исключительно ООП. И ему сугубо фиолетово что и когда сделают потом с буфером в котором жил убиенный инстанс. Для ООП важно отсутсвие у оных убиенных инстансов загробной жизни а не то как и будет ли вообще переиспользован буфер или память реально бесконечная. А менеджер памяти занимается исключительно обеспечением переиспользования буферов. и ему сугубо фиолетово кто там вообще жило и как именно и когда того кто там жил убили. Что же касается жабы то в этой ошибке природы по незнанию поймали те же грабли как и в симуле, потому что симула имела очень ограниченное хождение в европейских академических кругах, но никак не в америках где ява была первой попыткой создания профессионального ООП языка (все остальные профессиональные языки с поддержкой ООП спроектировали европейцы). И соответственно когда это выяснилось попытались прикрутить костыли в виде финализаторов и мягких ссылок, которые ничего не исправляют в плане непригодности к автоматическому управлению временем жизни инстансов, а только снижают и без того напрочь отстутствующую эффективность менеджера памяти, потому как для выполнения финализаторов к тому времени когда это что мертвому припарка в плане соблюдения правил ООП, требует обхода не только живых но и мертвых. При этом у GC концепция владения перевернута по сравнению с концепцией композиции используемой в ООП. А соответсвенно ни о какой реализации правил ООП при помощи GC не может быть и речи. Это реализуется только инстантным обходом убиенных с убивством композированных инстансов. И это именно то что делает кастомизируемая автоматика в профессиональных языках. Там же где синтаксис не позволил добавить такую автоматику (для нее требуется объявление перемнных в скопе а не в отдельной секции). GC выбросили поскольку ручной вызов деструкторов (специальный метод разрушающий инстанс) для инстансов выходящих из скопа все равно необходим и при использовании GC, иначе правила ООП собблюсти невозможно. При этом возврат динамических буферов менеджеру памяти по ходу пьессы оказался гораздо эффективней. Хотя бы потому что не имеет накладных расходов на содержание живых которых в ООП всегда гораздо больше чем мертвых. Т.е. суть - в ООП правила времени жизни определяются строго, в отличии от каши в этом плане ФП. Соответственно с концепцией композиции и агрегации список инстансов подлежащих уничтожению всегда известен заранее и никакого сканирования для его построения не нужно в принципе. Но именно эта ошибка допущенная в яве пошла в обучение в школах аки предмет национальной гордости (догоним и перегоним европу типа). И именно потому что жаба пошла в школы шарп и есть жаба++ кое-как адаптировання к визуальному формошлепству а не что либо другое. Потому что в офисе скриптовым языком дожно быть что то основанное на том что учат в школах. Таковы реалии америк. Но это не значит что GC используемый в net чем то отличается от GC который был в лиспе. Алгоритм сканирования тот же. Все остальное не более чем костыли и попытки оптимизации. Но сколько не оптимизируй то что в принципе непригодно пригодным оно не станет. Поэтому управление жизненным циклом инстансов в нет как и влюбом другом языке не имеющем средств автоматики управления жизненным циклом ресурсов осуществляется исключительно вручную.
0
|
|
|
|
|
| 25.06.2019, 21:51 | |
|
Fulcrum_013, вы, как будто, инженер впавший в кому 20 лет назад и вышедший из неё только сегодня. Технологии шагнули далеко вперед, и, вместе с ними, сборщики мусоров, языки, рантаймы и т.д. Если вы суслика не видите, то это не значит, что его нет. Это всё работает. Причем хорошо работает. Я не парюсь вообще насчет памяти занимаемой инстансами объектов в .NET и никогда не парился. Всё что вы пишите про сравнение, про историю, про другие языки - всё болтология. Ни одной ссылки на документацию, ни одного реального примера из .NET. Читайте-развивайтесь сами, вас не пробить.
2
|
|
| 25.06.2019, 22:23 | |
|
Не по теме: Человек словно форумом ошибся, но упорно пытается доказать верность своих знаний в другой области.
0
|
|
|
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
|
|||||
| 25.06.2019, 22:36 | |||||
|
0
|
|||||
|
|
|||||
| 25.06.2019, 22:43 | |||||
0
|
|||||
|
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
|
|
| 25.06.2019, 22:50 | |
|
0
|
|
|
|
|
| 25.06.2019, 22:56 | |
|
Fulcrum_013, я понимаю вас, честно. У меня даже есть очень хороший друг, пишуший веб-сервисы на С++, и считающий это удобным.
Просто, не нужно отверткой гвозди заворачивать. У всего есть свое применение и ниша, даже у джаваскрипкта (прости господи)
0
|
|
|
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
|
|||
| 25.06.2019, 23:00 | |||
|
Под ручным управлением вообще то подразумевается возможность вручную выбирать наиболее эффективный алгоритм распределения/высвобождения из общей кучи и субкуч для каждой конкретной структуры данных. А вот стартуют эти алгоритмы как раз автоматически и вовремя, что позволяет обеспечить автоматическое соблюдение правил взаимосвязей ООП. Добавлено через 2 минуты
0
|
|||
|
|
||
| 25.06.2019, 23:03 | ||
|
0
|
||
|
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
|
|||||
| 25.06.2019, 23:23 | |||||
|
Добавлено через 8 минут Не говоря о более сложных случаях когда хозяев несколько и к уничтожению объекта приводит разрыв связи/уничтожение любого из хозяев. Это уже не касаясь темы управления ресурсами и т.д. которыми GC управлять не способен в принципе. А автоматика плюсов управляет абсолютно так же как и памятью. Потому что построена именно по принципу управления жизненным циклом инстансов владеющих ресурсами, а память рассматривается как вид ресурса чем она и является на самом деле. Добавлено через 3 минуты Его требует разрыв композиции. Композиция же в плюсах в подавляющем большинстве случаев вообще пользуется статическая. т.е. вместе родились и вместе же и умрут одним куском памяти. Добавлено через 6 минут
0
|
|||||
| 25.06.2019, 23:23 | |
|
Помогаю со студенческими работами здесь
40
Как создать экземпляр класса библиотеки Как получить искомый экземпляр класса одной поисковой строкой LINQа Ссылка на объект не указывает на экземпляр объекта Ссылка на объект не указывает на экземпляр объекта Ссылка на объект не указывает на экземпляр объекта. Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
|
Модель здравосохранения 18. Чем здоровее работник, тем быстрее выгорает
anaschu 24.05.2026
Имитационная модель корпоративного здравоохранения: что показывает математика
Сегодня в модели рабочего коллектива на AnyLogic появились три новые механики — выгорание через накопленную усталость,. . .
|
Модель здравосохранения 17. Планы на выгорание
anaschu 23.05.2026
Вот конкретная схема реализации:
В классе Работник добавить:
накопленнаяУсталость — растёт каждый час работы, снижается в перерывы и болезни
коэффициентПрезентеизма — снижает продуктивность. . .
|
Изменение цветов в палитре gif файла aka фавикона
russiannick 23.05.2026
Изменение цветов в палитре gif файла, юзаемого как фавиконка в составе html-файла, помещенная в base64, средствами нативного Java Script, навеянное сном в майский день.
Для работы необходим браузер,. . .
|
|
Модель здравосохранения 16. Слишком хорошие и здоровые сотрудники уходят, недовольные зарплатой
anaschu 23.05.2026
Отладка увольнений и настройка производительности
Сегодня во второй половине дня разобрались с механикой увольнений и настроили коэффициент сложности заданий. Вот что было сделано.
. . .
|
Как я стал коммунистом))) Модель сохранения здоровья сотрудников, запись блога номер 15
anaschu 23.05.2026
Внезапно хорошее здоровье сотрудников не нужно капиталистам?))
|
Модель здравоСохранения 15. Как мы чинили AnyLogic модель рабочего коллектива: сочленение диаграммы состояний болезней и поломок в ресурспул
anaschu 23.05.2026
Как мы чинили AnyLogic модель рабочего коллектива
Сегодня разобрались с пятью багами, из-за которых модель либо падала с ошибкой, либо давала совершенно бессмысленные результаты. Каждый баг был. . .
|
Диалоги с ИИ
zorxor 23.05.2026
Насколько я понимаю - Вы - Искусственный Интеллект. Это так?
Да, всё верно. Я — искусственный интеллект.
Я представляю собой большую языковую модель, созданную для помощи в самых разных задачах. . . .
|