Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.64/141: Рейтинг темы: голосов - 141, средняя оценка - 4.64
3 / 3 / 1
Регистрация: 11.03.2019
Сообщений: 42

Как уничтожить экземпляр класса (объект)?

21.06.2019, 16:48. Показов 30425. Ответов 119

Студворк — интернет-сервис помощи студентам
Я столкнул с такой проблемой. Я не могу понять как удалять объекты класса(экземляры). Читая интернет я вижу что "мусорщик" должен автоматически удалять те объекты, на которые нет указателя, но у меня это не работает. Подскажите как решить. Вот видео где всё показано, по нажатию кнопки в указатель записывается новый объект, но старый не удаляется, это видно по увеличению кол-ва оперативной памяти занимаемого приложением.

https://www.youtube.com/watch?... e=youtu.be
Кликните здесь для просмотра всего текста
1
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.06.2019, 16:48
Ответы с готовыми решениями:

Как в случае с Dependency Injection внедрять отдельный экземпляр некоторого класса только лишь для одного другого класса
Здравствуйте, пытаюсь понять как же всё таки правильно использовать Dependency Injection в случае c ASP.NET Web Api2 и Entity Framework 6...

Как увидеть объект Session и объект Server из модуля класса?
В модуле класса пишу: 'Provider=Microsoft.Jet.OLEDB.4.0;' & _ 'Data Source=' & Server.MapPath('../InterDict.mdb')...

Как создать экземпляр класса по условию
Доброго времени суток. Нужна помощь в решении следующей задачи: Исходные данные Имеется решение типа WindowsFormsApplication. В нем,...

119
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
01.07.2019, 02:33
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Вот тут вам пример графа.
C# vs Kotlin
Это без инстаного разрушения инстансов при разрыве ссылок работать не будет в принципе.
Не будет. А причем тут Dispose?

Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Такое что Dispose - костыль предназначенный для ручной реализации именно такого поведения.
C++
1
2
    int* array = new int[10];        
    delete[] array;
Как с помощью Dispose вручную реализовать именно такое поведение?

Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Сборщик не в состоянии обрабатывать слабые ссылки вовремя.
Вкурсе вообще как часто и при каких обстоятельствах запускается GC?
0
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
01.07.2019, 03:44
Цитата Сообщение от nicolas2008 Посмотреть сообщение
Вкурсе вообще как часто и при каких обстоятельствах запускается GC?
Как написано у мелкомягких - переодически. Обычно когда предвыделенный буфер памяти закончился перед отгрызанием новых страниц у оси. Т.е. в принципе может и вооще никогда не запустится. Но главное что он в любом случае запускается отложенно. Что абсолютно неприемлимо для управления жизненным циклом инстансов/ресурсов.

Добавлено через 3 минуты
Цитата Сообщение от nicolas2008 Посмотреть сообщение
Как с помощью Dispose вручную реализовать именно такое поведение?
А при чем тут вообще уничтожение самого буфера то? Это и ежу понятно что у плюсов куча а у шарпа эмулятор стека с компрессией и работают они по разному. Вопрос не о буферах а о живущих в них инстансах. А когда сами буфера уничтожаются и уничтожаются ли они вообще или память реально бесконечная для обеспечения корректности поведения инстансов вообще фиолетово.

Добавлено через 1 минуту
Цитата Сообщение от nicolas2008 Посмотреть сообщение
Не будет. А причем тут Dispose?
При том что он предназначен для ручного осуществления инстантного разрушения инстанса раз уж автоматика для этого негодная. Точная копия паскалевского деструктора.
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,576
01.07.2019, 04:03
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Но главное что он в любом случае запускается отложенно. Что абсолютно неприемлимо для управления жизненным циклом инстансов/ресурсов.
А я вот считаю что GC с его отложенным запуском вполне справляется с управлением жизненным циклом инстансов/ресурсов, докажите мне обратное раз вы утверждаете что отложенный запуск GC для этого неприемлем.

У меня вот за много лет пока не возникло такой ситуации, где GC бы не справился...
0
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
01.07.2019, 04:51
Someone007, Уже показывали очень распространенную ситуацию в которой он не применим в принципе.

Добавлено через 3 минуты
Цитата Сообщение от Someone007 Посмотреть сообщение
я вот считаю что GC с его отложенным запуском вполне справляется с управлением жизненным циклом инстансов/ресурсов
Да можете считать что угодно. Но лучше таки читать то что по этому поводу пишут произвозводители в инструкции к оному GC . А пишут они что программа не должна рассчитывать на то что финализаторы будут когда либо вызваны автоматически.

Добавлено через 8 минут
Someone007, А еще лучше понимать принцип работы алгоритма сканера объектов и, в результате, понимать почему они это пишут, и точно знать почему в инструкции к GC никогда что то другое написано не будет.

Добавлено через 26 минут
Цитата Сообщение от Someone007 Посмотреть сообщение
У меня вот за много лет пока не возникло такой ситуации, где GC бы не справился...
Очень странно. Я его в ситуацию где он не справился на первой же лабораторке по Симула-67 загнал. Тогда собственно и разобрался досканально почему этот анахронизм из всех профессиональных языков выбросили еще в начале 80-х.
Вы наверное кроме CURD под винформз/wpf ничем его не озадачивали? Так там к корректному поведению фреймверка GC вообще не при чем. Под капотом ручной разрыв взаимосвязей путем вызова Dispose на каждом шагу один в один с дельфой. Потому при пользовании фреймверком это и не сильно заметно пока только CURD гоняешь точно так же как в дельфе. А вот когда дело доходит до расширения фреймверка или сложных иерархий объектов для моделирования чего либо вот тут и начинаются опаньки и сразу очень хорошо видно что от полного ручника паскалевского разлива наличие GC ничем не отличается кроме бесполезного оверхеда. Кстати причина по которой винформз настолько куцей по сравнению с дельфой получилась.
0
Эксперт .NET
 Аватар для Usaga
14731 / 9505 / 1363
Регистрация: 21.01.2016
Сообщений: 35,855
01.07.2019, 06:14
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Уже показывали очень распространенную ситуацию в которой он не применим в принципе.
Вы ничего не показали. Всё, что вы показывали было опровергнуто.
0
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
01.07.2019, 06:32
Usaga Идите учите доку. А то даже не можете понять что пытаетесь в качестве опровержений пихать подтверждения. НУ не работает оно без вызова Dispose как надо. А как его вызывают - с using или без - это к пригодности GC отношения не имеет. ТАк что еще раз - вытатуируйте у себя на лбу слово быдлокодер раз даже мануал понять не в состоянии.
0
Эксперт .NET
 Аватар для Usaga
14731 / 9505 / 1363
Регистрация: 21.01.2016
Сообщений: 35,855
01.07.2019, 07:27
Fulcrum_013, я вам код выше приводил, где было чётко видно, что Dispose() ничего не уничтожает и в процессе сборки мусора не участвует. Или вы хотите сказать, что объекты классов без метода Dispose() вообще не убираются?

Приведите цитату из "доки", где говорится о том, что Dispose() уничтожает инстанс. Напомню вам вашу фразу:
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Поэтому если нужно принудительно разрушить объект то пишите для этого специальный метод который высвобождает ресурсы и т.д.(по конвенции он называется Dispose) и вызываете его ручками.
Будьте добры показать как с помощью Dispose можно принудительно разрушить объект. Докажите пожалуйста, что вы не ботало.
1
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
01.07.2019, 09:28
Цитата Сообщение от Usaga Посмотреть сообщение
Будьте добры показать как с помощью Dispose можно принудительно разрушить объект.
Точно так же как он уничтожается при помощи деструктора. Не понимаете о чем речь - идите учите матчасть.
0
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
01.07.2019, 12:34
Fulcrum_013, сам по себе деструктор не удаляет обьект. Он только описывает дополнительные шаги которые необходимо выполнить при удалении обьекта.

Добавлено через 7 минут
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
А при чем тут вообще уничтожение самого буфера то? Это и ежу понятно что у плюсов куча а у шарпа эмулятор стека с компрессией и работают они по разному. Вопрос не о буферах а о живущих в них инстансах. А когда сами буфера уничтожаются и уничтожаются ли они вообще или память реально бесконечная для обеспечения корректности поведения инстансов вообще фиолетово.
Удаление обьекта - это освобождения памяти.
Откуда эта ересь о "эмуляторе стека с компрессией"?
0
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
01.07.2019, 13:20
Цитата Сообщение от nicolas2008 Посмотреть сообщение
Он только описывает дополнительные шаги которые необходимо выполнить при удалении обьекта.
Он разрушает инстанс (объект в терминах ООП). А это абсолютно не тоже самое что объект в терминах GC (банальный кусок памяти).

Добавлено через 5 минут
Цитата Сообщение от nicolas2008 Посмотреть сообщение
Откуда эта ересь о "эмуляторе стека с компрессией"?
Из назначения GC. Он проектировался для того чтобы держать в аппаратном стеке только адреса возвратов, а стек данных на внешнем накопителе (перфолентеленте, позже магнитной ленте). При этом для перфоленты абсолютно необходимо переодически переписывать на новую ленту актуальные данные, а для магнитной ленты такая же дефрагментация снижает потребную перемотку . А вы думаете этот анахронизм еще для чего то годен? Для памяти с призвольным доступом а тем более при ее страничной организации дефрагментация полный нонсенс. А для какая либо годная для ООП автоматика у GC отсутствует от слова совсем. При этом неумение размещать промежуточные данные на аппаратном стеке выходит большим боком исключающим многопоточность.
0
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
01.07.2019, 14:16
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Он разрушает инстанс (объект в терминах ООП). А это абсолютно не тоже самое что объект в терминах GC (банальный кусок памяти).
Ничего он не разрушает. Он запускает освобождение памяти для обьектов которыми владеет.

Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Из назначения GC. Он проектировался для того чтобы держать в аппаратном стеке только адреса возвратов, а стек данных на внешнем накопителе (перфолентеленте, позже магнитной ленте). При этом для перфоленты абсолютно необходимо переодически переписывать на новую ленту актуальные данные, а для магнитной ленты такая же дефрагментация снижает потребную перемотку .
Я не знаю что там у вас за анахронизмы в голове. Может не анахронизмы, а просто каша.
Вы хоть одну книгу о .NET прочитали? Или все ваши познания об организации памяти основаны на каких то флешбеках из прошлого? Или просто фантазии?

Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Для памяти с призвольным доступом а тем более при ее страничной организации дефрагментация полный нонсенс.
А как же массивы которые требуют выделения неразрывного участка памяти?

Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
При этом неумение размещать промежуточные данные на аппаратном стеке выходит большим боком исключающим многопоточность.
Либо вы подтверждаете свои бредовые изречения авторитетными источниками, либо разговор окончен.
0
548 / 355 / 120
Регистрация: 17.08.2014
Сообщений: 1,351
01.07.2019, 14:42
Судя по заваленным тестам С#, человек вообще не отдупляет что такое C# и с чем его едят.
0
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
01.07.2019, 14:48
Цитата Сообщение от nicolas2008 Посмотреть сообщение
Либо вы подтверждаете свои бредовые изречения авторитетными источниками, либо разговор окончен.
Единственный источник который может быть авторитетным - математический анализ алгоритма. Наука к вашему сведению авторитетов не признает.

Добавлено через 2 минуты
Цитата Сообщение от nicolas2008 Посмотреть сообщение
А как же массивы которые требуют выделения неразрывного участка памяти?
Вот страничная организация памяти этот вопрос и решает. Выбираются полностью пустые страницы и перемапируются в конец адресного пространства. Что на кучу порядков быстрее чем постоянные дефрагментации. При этом активный дефрагментатор в любом случае сливает пассивному нефрагментатору а тем более субкучам и управлению на основе регионов.
0
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
01.07.2019, 14:50
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Единственный источник который может быть авторитетным - математический анализ алгоритма. Наука к вашему сведению авторитетов не признает.
Понял. Значит разговор окончен.
0
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
01.07.2019, 14:55
Цитата Сообщение от nicolas2008 Посмотреть сообщение
Вы хоть одну книгу о .NET прочитали?
А что алгоритм сканера GC с 59-го года мог как то изменился? Только получил некоторые оптимизации да и то они чаще пессимизации чем оптимизации. Но как не оптимизируй в принципе непригодный к управлению жизненным циклом алгоритм пригодным он от этого не станет.

Добавлено через 4 минуты
Цитата Сообщение от nicolas2008 Посмотреть сообщение
Он запускает освобождение памяти для обьектов которыми владеет.
Вообще то память высвобождает ТОЛЬКО GC в языках с GC или специальная функция в языках без оного. А деструктор точно так же как и Dispose производит логическое разрушение экземпляра класса - т.е. отвязку его от модели данных, и высвобождение владемых ресурсов. После этого объект для модели считается несуществующим и его буфер безопасно переиспользовать.
0
Эксперт .NET
 Аватар для Usaga
14731 / 9505 / 1363
Регистрация: 21.01.2016
Сообщений: 35,855
03.07.2019, 05:58
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Точно так же как он уничтожается при помощи деструктора. Не понимаете о чем речь - идите учите матчасть.
Покажите пример кодом, где Dispose() уничтожает объект. Докажите, что вы не трепло (вангую: не докажите).
0
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
03.07.2019, 07:00
Цитата Сообщение от Usaga Посмотреть сообщение
Покажите пример кодом, где Dispose() уничтожает объект.
ну для примеру вот так
C#
1
2
3
4
5
6
7
8
9
10
11
class Foo{
  HWND wnd;
  …
  Dispose(){
     if (wnd != INVALID_HANDLE){
           DestroyWindow(wnd);
           wnd = INVALID_HANDLE
 
    } 
 }
}
Один в один с деструктором в паскале. Т.е. высвобождение ресурсов и т.д. манипуляции приводящие объект в состояние в котором переиспользование его буфера безопасно. Т.е. перезапись буфера другими данными не приведет ни к каким утечкам в т.ч. ресурсов, висячкам и т.д. в зависимости от назначения класса и его места в иерархии.
0
Эксперт .NET
 Аватар для Usaga
14731 / 9505 / 1363
Регистрация: 21.01.2016
Сообщений: 35,855
03.07.2019, 07:12
Fulcrum_013, а уничтожение самого объекта где?
0
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
03.07.2019, 07:16
Цитата Сообщение от Usaga Посмотреть сообщение
а уничтожение самого объекта где?
А вот это оно и есть. После этого телодвижения то что осталось в буфере объектом (сущностью предметной области) уже не является. А соответсвенно безопасно переписать буфер другими данными.
0
Эксперт .NET
 Аватар для Usaga
14731 / 9505 / 1363
Регистрация: 21.01.2016
Сообщений: 35,855
03.07.2019, 07:19
Fulcrum_013, вы просто декриптор окна закрыли. Где уничтожение самого объекта Foo?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.07.2019, 07:19

Как создать экземпляр класса библиотеки
есть сервер создаю прослушку ChannelServices.RegisterChannel(new HttpChannel(60000)); ServerAccess1 ser = new...

Как получить искомый экземпляр класса одной поисковой строкой LINQа
Здравствуйте, Вопрос по LINQ Скажем есть класс Person и есть список этих классов. Person p1 = new Person() { name =...

Ссылка на объект не указывает на экземпляр объекта
Народ, объясните пожалуйста что делаю не так??? Есть класс (Client), из него нужно поменять пару текстовых полей на основной форме...

Ссылка на объект не указывает на экземпляр объекта
всем привет! на днях друг попросил сделать фейк прогу на visual studio, одна получилась все без ошибок работает, а вот остальные вылазиет...

Ссылка на объект не указывает на экземпляр объекта.
Добрый день. При выполнении кода: dynamic zapros_cena = ExecuteCreateObject(baza, "NewObject", new object { "Запрос"...


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

Или воспользуйтесь поиском по форуму:
100
Закрытая тема Создать тему
Новые блоги и статьи
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины". За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html Задача: . . .
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru