3 / 3 / 1
Регистрация: 11.03.2019
Сообщений: 42

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

21.06.2019, 16:48. Показов 30514. Ответов 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
 Аватар для Cupko
658 / 595 / 171
Регистрация: 17.07.2012
Сообщений: 1,682
Записей в блоге: 1
25.06.2019, 23:26
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Потому что GC не в состоянии соблюдать простейшие правила композиции. А именно - композированный объект уничтожается при разрыве ссылки без всяческих оговорок - т.е. независимо от наличия других трасс на рут. Передача владения при композиции запрещена. Этого Net тоже обеспечить не в состоянии.
Не говоря о более сложных случаях когда хозяев несколько и к уничтожению объекта приводит разрыв связи/уничтожение любого из хозяев.
Да с чего вдруг-то? Откуда у вас такая уверенность? Как-раз таки при Mark&Sweep алгоритмe все ссылки учитываются.
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Вы часом композицию с агрегацией не перепутали? Разрыв аггрегации как раз не требует удаленияя связанного объекта.
Его требует разрыв композиции. Композиция же в плюсах в подавляющем большинстве случаев вообще пользуется статическая. т.е. вместе родились и вместе же и умрут одним куском памяти.
Нет, не путаю, агрегат из DDD.

UPD: https://en.wikipedia.org/wiki/... collection
0
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
25.06.2019, 23:38
Цитата Сообщение от Cupko Посмотреть сообщение
Нет, не путаю, агрегат из DDD.
UPD: https://en.wikipedia.org/wiki/... collection
А каким боком вооще термины GC относятся к правилам взаимосвязей используемым в ООП?

Добавлено через 3 минуты
Цитата Сообщение от Cupko Посмотреть сообщение
Да с чего вдруг-то?
Да с того что имплементировать эти правила можно только при инстантной реакции на разрыв ссылки. Т.е. аналогично вызову GC.Collect при каждом изменении ссылки. Очевидно что при таких делах трассировка от удаляемого вниз гораздо дешевле потому что обход каждого объекта осуществляется строго один раз за его жизненный цикл а не каждую уборку. И при этом запрет на передачу владения делает MArk&Sweept банально ненужным потому чот исключает образование оторвавшегося кольца.
0
 Аватар для Cupko
658 / 595 / 171
Регистрация: 17.07.2012
Сообщений: 1,682
Записей в блоге: 1
25.06.2019, 23:39
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
А каким боком вооще термины GC относятся к правилам взаимосвязей используемым в ООП?
А каким боком ваши правила взаимосвязей используемым в ООП покрывают остальные термины? Мы мыслим явно в разных плоскостях.
Хотите композицию - будем говорить "композиция".
0
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
26.06.2019, 01:59
Cupko, Таким что термин "язык с поддержкой ООП" обозначает нечто что облегчает имплементацию правил именно ООП как это делают к примеру плюсы и ада, а не мусоросборника, который и имплементацию оных правил позволяет исключительно вручную аки в паскакалях и только резко снижает эффективность по сравнению с отсутсвием оного мусоросборника .

Добавлено через 8 минут
Цитата Сообщение от Cupko Посмотреть сообщение
Мы мыслим явно в разных плоскостях.
Естественно. Потому что вы видимо не в курсе что к утечкам как памяти так и других ресурсов приводит исключительно несоблюдение правил взаимосвязей четко обозначенных ООП. Причем использование манаджед языков при росте объемов проекта приводят к утечкам в любом случае, в силу полного отсутсnвия автоматики управления жизненым циклом инстансов в отличии от тех же плюсов. А так же к куче еще огромного кличества негараздов которые в общем называются некорректным поведением софтины.

Добавлено через 2 часа 1 минуту
Цитата Сообщение от Cupko Посмотреть сообщение
Да не важна память с точки зрения предметной области в принципе.
Важно разрушать инстансы вовремя. Именно с точки зрения предметной области. А обеспечивающая это автоматика просто бонусом дает и кастомизируемую автоматику управления ресурсами и в том числе памятью (буферами в которых поживают разрушаемые инстансы) гораздо более эффективную и гибкую чем GC.
0
Эксперт .NET
 Аватар для Usaga
14740 / 9514 / 1364
Регистрация: 21.01.2016
Сообщений: 35,904
27.06.2019, 05:58
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Инстанс после вызова деструктора, роль коего в нетах исполняет Dispose
Dispose не играет роли деструктора. Этот метод не учавствует в сборке мусора или логическом уничтожении объекта. Я вам пример уже показал.

Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
И задачи у него те же - разрушение инстанса.
Да фиг вы угадали. Это вы сами себе придумали. Приведите пример такого разрушения, а мы посмотрим, ок?
1
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
27.06.2019, 13:09
Цитата Сообщение от Usaga Посмотреть сообщение
Этот метод не учавствует в сборке мусора или логическом уничтожении объекта.
На самом деле сборка мусора не участвует в логическом уничтожении. Этим и занимается Dispose();

Цитата Сообщение от Usaga Посмотреть сообщение
Приведите пример такого разрушения, а мы посмотрим, ок?
Любой нетривиальный Dispose(). Логическое уничтожение объекта - это высвобождение ресурсов и разрыв взаимосвязей. Именно то для чего Dispose и предназначен.
0
3 / 3 / 1
Регистрация: 11.03.2019
Сообщений: 42
27.06.2019, 18:37  [ТС]
Я нашёл решение всех моих проблем. функция System.GC.Collect(); принудительно и сразу заставляет сборщик мусора чистить память. Спасибо всем кто пытался помочь и разобраться.
0
 Аватар для Cupko
658 / 595 / 171
Регистрация: 17.07.2012
Сообщений: 1,682
Записей в блоге: 1
27.06.2019, 19:05
Цитата Сообщение от Roman Pytkov Посмотреть сообщение
System.GC.Collect(); принудительно и сразу заставляет сборщик мусора чистить память.
Спешу вас огорчить. Не заставляет и не сразу.
0
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
27.06.2019, 23:09
Цитата Сообщение от Roman Pytkov Посмотреть сообщение
Я нашёл решение всех моих проблем. функция System.GC.Collect(); принудительно и сразу заставляет сборщик мусора чистить память.
Если помогает именно это то ваша задача требует язык с современной автоматикой в этом плане а не архаичный GC. Отказ от GC произошел именно потому что для обеспечения корректности уничтожения инстансов соответствующего правилам ООП требуется вызов сборки мусора после каждого изменения/выхода из скопа ссылки. т.е. получается абсолютное отсутствие автоматики. Обеспечивает же нужное поведение полностью автоматически и эффективным способом только языки с автоматическим управлением временем жизни объектов, к которому GC не предназначен и не способен в принципе. С этим вопросом к С++.
0
Эксперт .NET
 Аватар для Usaga
14740 / 9514 / 1364
Регистрация: 21.01.2016
Сообщений: 35,904
28.06.2019, 08:09
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
На самом деле сборка мусора не участвует в логическом уничтожении. Этим и занимается Dispose();
Dispose() не занимается логическим уничтожением. Просто метод, который вызывается при определённых условиях (оператор using). Это не значит, что состояние объекта должно как-то изменяться. Не обязывает его.

Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Любой нетривиальный Dispose(). Логическое уничтожение объекта - это высвобождение ресурсов и разрыв взаимосвязей. Именно то для чего Dispose и предназначен.
О, боже.

Цитата Сообщение от Roman Pytkov Посмотреть сообщение
Я нашёл решение всех моих проблем. функция System.GC.Collect();
Не трогайте эту функцию. Она вам не нужна.
1
215 / 149 / 48
Регистрация: 28.12.2016
Сообщений: 716
28.06.2019, 08:28
Roman Pytkov, вы смотрели в диспетчер, там показывается не сколько потребляет ОЗУ программа, а сколько ей выделено. Если смотреть кучу, то мы увидим прирост только 1 раз.

К примеру у вас 150 кб
клик на кнопку. диспетчер 151, куча 151
клик на кнопку. диспетчер 152, куча 151
и т.д
Как только память потребуется другим приложениям, у вашей программы часть или полностью заберут неиспользуемую память.


1 скрин : запуск программы
2 скрин : первый раз нажали кнпоку
3 скрин : 2-3 раза нажали на кнопку


Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
 public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private Test tester;
        private void button1_Click(object sender, EventArgs e)
        {
            var test = new List<ClassType>()
            {
                ClassType.Hello,
                ClassType.Hello,
                ClassType.Hello
            };
 
            var test2 = new List<ClassType>()
            {
                ClassType.Hello,
                ClassType.Hello,
                ClassType.World
            };
 
            var test3 = new List<ClassType>()
            {
                ClassType.Hello,
                ClassType.World,
                ClassType.Hello
            };
 
            List<List<ClassType>> nlist = new List<List<ClassType>>()
            {
                test,
                test2,
                test3
            };
 
            tester = new Test(nlist);
 
        }
    }
 
    class Test
    {
        private List<List<ClassType>> list;
        public Test(List<List<ClassType>> nlist)
        {
            list = nlist;
        }
    }
 
    enum ClassType
    {
        Hello,
        World
    }
Миниатюры
Как уничтожить экземпляр класса (объект)?   Как уничтожить экземпляр класса (объект)?   Как уничтожить экземпляр класса (объект)?  

0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,051
Записей в блоге: 1
28.06.2019, 11:54
Цитата Сообщение от Usaga Посмотреть сообщение
Просто метод, который вызывается при определённых условиях
об этом же говорит и ЭТО

------------------
ну и пример использования
Не нашёл ни единого документа, где непосредственно IDisposable что-то вообще делает с ресурсами.
Так же, производителем C# указано, что и деструктор то нельзя вызвать, что говорит о том, что программист C# НЕ управляет уничтожением объекта в памяти.
0
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
28.06.2019, 14:14
Цитата Сообщение от Usaga Посмотреть сообщение
Dispose() не занимается логическим уничтожением.
Определите для начала суть логического уничтожения. А вот тогда четко видно что именно этим и занимается Dispose. Деструктор это тоже метод который вызывается при определенных условиях. При этом буфер объекта деструктор тоже не уничтожает.
Цитата Сообщение от skilllab Посмотреть сообщение
Так же, производителем C# указано, что и деструктор то нельзя вызвать, что говорит о том, что программист C# НЕ управляет уничтожением объекта в памяти.
А Dispose - костыль который этот косяк исправляет. IDisposable вызывает Dispose из деструктора который ничего другого не делает - т.е. переносит весь функционал в обычный метод. Вот вам и возможность вызова деструктора вручную.

Добавлено через 7 минут
Цитата Сообщение от Usaga Посмотреть сообщение
Не обязывает его.
Точно так же никто не обязывает деструктор изменять состояние объекта. Он просто предоставляет программисту такую возможность точно так же как и Dispose().

Добавлено через 2 минуты
Цитата Сообщение от skilllab Посмотреть сообщение
Не нашёл ни единого документа, где непосредственно IDisposable что-то вообще делает с ресурсами.
Точно так же вы не найдете ни одного документа где написано что деструктор в каком либо языке должен что то делать с ресурсами. Описывается только когда и как он автоматически вызывается. А вот что в нем делать - это уже забота программиста. Только программисту который пишет конкретно взятый класс известно что нужно делать в деструкторе для логического разрушения объекта, и нужно ли что то делать вообще.
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,051
Записей в блоге: 1
28.06.2019, 16:36
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
IDisposable вызывает Dispose из деструктора
Эммм...нет.

Добавлено через 8 минут
Я могу вызвать Dispose() и без деструктора. А деструктор сработает когда-то там...

Добавлено через 2 минуты
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
А вот тогда четко видно что именно этим и занимается Dispose
Нет))) Выше по ссылке производителя C# ариалом по белому написано зачем нужен Dispose().
0
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
28.06.2019, 16:42
Цитата Сообщение от skilllab Посмотреть сообщение
Нет))) Выше по ссылке производителя C# ариалом по белому написано зачем нужен Dispose().
По ссылке выше написано не про сам Dispose а про его вызов при помощи using. При этом нужен этот костыль с using именно для логического разрушения объекта вовремя по правилам ООП, чего GC сделать не в состоянии в принципе. Он только способен физически уничтожить(переиспользовать) буфер объекта когда нибудь потом.
0
215 / 149 / 48
Регистрация: 28.12.2016
Сообщений: 716
28.06.2019, 16:55
Fulcrum_013, всмысле using, то есть по мимо обертки в try/finally еще что-то происходит?. Просто вызов Dispose() не достаточно? А как быть тогда, ибо using это по сути зло, которое замедляет выполнение программы из-за не нужной обертки в try
0
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
28.06.2019, 16:58
Defences, using просто вызывает Dispose автоматически в конце блока в том числе и в случае если выполнение блока прервано экскепшином. Ну типа незабывайки вызова. А без using просто вручную вызываете аки в паскале деструктор.
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,051
Записей в блоге: 1
28.06.2019, 17:09
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
А без using просто вручную вызываете аки в паскале деструктор.
Без using это могло работать так:
C#
1
2
3
4
5
6
7
ResourceType resource = expression;
    try {
        statement;
    }
    finally {
        ((IDisposable)resource).Dispose();
    }
а в самом Dispose() https://referencesource.micros... references ....
да ничего не происходит)))) ибо интерфейс. Покажите пожалуйста код, где у производителя языка C# метод Dispose() вызывает деструктор.

Добавлено через 2 минуты
Производитель языка C# пишет о том, что метод Dispose() можно вызвать в деструкторе. Как и любой другой метод)))
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 ~ActivationContext()
        {
            Dispose(false);
        }
 
........
private void Dispose(bool fDisposing)
        {
            // ISSUE- should release unmanaged objects in array lists.
            _applicationIdentity = null;
            _definitionIdentities = null;
            _manifests = null;
            _manifestPaths = null;
 
            if (_actContext != null)
                Marshal.ReleaseComObject(_actContext);
        }
Добавлено через 1 минуту
Что говорит о том, что Dispose() это всего лишь Интерфейс, указывающий программисту не забыть обнулить ссылки на неуправляемые ресурсы
0
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
28.06.2019, 17:14
Цитата Сообщение от skilllab Посмотреть сообщение
Покажите пожалуйста код, где у производителя языка C# метод Dispose() вызывает деструктор.
Т.е. даже этого не сделали. Я был о них лучшего мнения. В общем без множественного наследования классов все не как у людей. Вместо того чтобы один раз впихнуть это в деструктор предка впихивайте сами в каждом наследнике.
Цитата Сообщение от skilllab Посмотреть сообщение
Производитель языка C# пишет о том, что метод Dispose() можно вызвать в деструкторе. Как и любой другой метод)))
Ну правильно. Не всегда объект нужно разрушать принудительно. Вот на случай если он разрушается перед уничтожением буфера GC из финализатораа не ручным вызовом и нужно вызывать Dispose(). Просто перенос функционала финализатора в метод который можно вызвать и вручную для принудительного уничтожения инстанса.
0
Эксперт JS
6497 / 3908 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
28.06.2019, 17:16
skilllab, что-то Вас не туда занесло.
Dispose() именно в первую очередь предназначен для вызова Dispose()/Close() классов с неуправляемыми ресурсами.

А обнуление ссылок в целом лишний шаг. Просто типа красиво.
-----
P.S.: Когда коту делать нечего, он уничтожение объектов обсуждает...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.06.2019, 17:16

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
60
Закрытая тема Создать тему
Опции темы

Новые блоги и статьи
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
Запись в регистр сведений независимо от заполненности табличной части
Maks 25.08.2026
Реализация из решения ниже выполнена на нетиповом документе с несколькими табличными частями, разработанного в КА2. Задача: Обеспечить запись документа в регистр сведений независимо от. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru