Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/32: Рейтинг темы: голосов - 32, средняя оценка - 4.63
 Аватар для Exvel
2 / 2 / 1
Регистрация: 26.02.2011
Сообщений: 64

Освобождение ресурсов при удаленнии объекта

11.03.2011, 08:51. Показов 6594. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.

Используется простое консольное приложение.
Есть объект, который пользуется внешними ресурсами, которые не могут быть очищены сборщиком мусора.
Приложение все время закрывается нажатием на крестик в углу окна.
Пытался освободить эти ресурсы при выходе из программы с помощью деструктора, но он, почему-то, не вызывается.
Думал про перехват события закрытия приложения, но хотелось бы, все же, сделать правильным способом через структура класса.

C#
1
2
3
4
5
6
7
8
9
10
11
12
public class myClass
{
       public myClass()
       {
              OpenLDevice();
       }
 
       ~myClass()
       {
              CloseLDevice();
       }
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.03.2011, 08:51
Ответы с готовыми решениями:

Освобождение управляемых ресурсов
1)Все знают что dispose() высовобождает неуправлямы ресурсы,а как высвободить управляемы? 2)Сборщик Мусора высвобождает управляемые и...

Освобождение ресурсов и ошибка System.NullReferenceException
Я написал класс: public class Database Который в веду сложности создания, имеет в конструкторе ряд эксепшенов типа: throw new...

Gdiplus - освобождение ресурсов GDI
Каким образом в gduplus в C# освобождать дескрипторы?! В C++ (без .net) вызывал просто функцию DeleteObject. Здесь как быть - не понятно. ...

13
 Аватар для FtarG
138 / 138 / 42
Регистрация: 02.11.2010
Сообщений: 316
11.03.2011, 09:10
Поставь брейкпоинт внутри деструктора, проверь входит ли он в него вообще, если да, то надо смотреть на логику функции CloseLDevice() может там косяк какой.
1
 Аватар для Konctantin
970 / 773 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
11.03.2011, 09:12
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class myClass : IDisposable
{
       public myClass()
       {
            OpenLDevice();
       }
       
       public void Dispose()
       {
            CloseLDevice();
       }
 
       ~myClass()
       {
            Dispose();
       }
}
И просто вызывайте метод Dispose()
1
 Аватар для Exvel
2 / 2 / 1
Регистрация: 26.02.2011
Сообщений: 64
11.03.2011, 10:08  [ТС]
Цитата Сообщение от FtarG Посмотреть сообщение
Поставь брейкпоинт внутри деструктора, проверь входит ли он в него вообще, если да, то надо смотреть на логику функции CloseLDevice() может там косяк какой.
А я не так делал. Добавил в деструктор создание пустого файла, чтобы определить вызывался ли он. Файл при выходе из программы не создавался. А как, кстати, брейкпоинты ставить?

Цитата Сообщение от Konctantin Посмотреть сообщение
И просто вызывайте метод Dispose()
Спасибо. Попробую так. Но разве это не то же самое?

Добавлено через 47 минут
Нашел как брейкпоинты ставить. Дописал интерфейс IDisposable. Но Dispose() не вызывается. Брейкпоинт не срабатывает. =(
Т.е. не вызывается именно при завершении приложения нажатием на крестик в окне. Если же завершить приложении нормально, то Dispose() достигается.
0
 Аватар для Konctantin
970 / 773 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
11.03.2011, 11:01
Обратно, непонятно как там и что написано у вас, а телепаты как раз в отпуске...
0
84 / 84 / 14
Регистрация: 15.02.2011
Сообщений: 252
11.03.2011, 11:06
Объект не будет собран сборщиком мусора, пока подписан на события.
Попробуйте System.GC
0
 Аватар для Konctantin
970 / 773 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
11.03.2011, 11:10
Попробуйте System.GC
да на кой он нужен?
Я же написал, что надо явно вызывать метод Dispose(), для чего когда его придумали?
0
 Аватар для Exvel
2 / 2 / 1
Регистрация: 26.02.2011
Сообщений: 64
11.03.2011, 11:18  [ТС]
Цитата Сообщение от Konctantin Посмотреть сообщение
Обратно, непонятно как там и что написано у вас, а телепаты как раз в отпуске..
Я же написал пример кода в первом сообщении. CloseLDevice и OpenLDevice не важны. Проблема, что деструктор не вызывается.

Цитата Сообщение от GOID Посмотреть сообщение
Объект не будет собран сборщиком мусора, пока подписан на события.
Попробуйте System.GC
А там он и так не на что не подписан.

Сделал для себя вывод, что деструктор не вызывается, если процесс резко прерывается, что и происходит, если консольное приложение закрывать через крестик на окне. Придется забиндить выход приложения на Esc и только так закрывать. Надеюсь, после переноса класса в WPF приложение, деструктор класса при закрытии окна будет вызваться.
0
 Аватар для Unril
826 / 717 / 110
Регистрация: 06.10.2010
Сообщений: 825
Записей в блоге: 1
11.03.2011, 14:21
Обрабатывай событие формы OnClosing или OnClosed и в них освобождай ресурсы. Или реализовывай интерфейс IDisposable и освобождай сразу после использования.
1
213 / 139 / 8
Регистрация: 18.08.2010
Сообщений: 1,018
09.11.2012, 17:17
еще проще: обернуть код, где используется ваш этот объект, в блок using. Тогда метод Dispose() будет гарантированно вызываться при выходе из блока
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
09.11.2012, 20:41
Exvel, при закрытии приложения уничтожается его домен, а вместе с ним освобождаются любые ресурсы, управляемые и неуправляемые.
Потому смысла в запуске сборщика при завершении приложения нет.
А если бы и запускался сборщик, то начались бы жалобы, что приложение долго закрывается.
0
 Аватар для orange
4 / 4 / 2
Регистрация: 25.02.2009
Сообщений: 40
29.03.2013, 10:21
Здравствуйте. Подскажите пожалуйста почему не вызывается деструктор объекта "a" при вызове GC.Collect(). Хотя я даже симулирую какую то работу с памятью ...
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
class A {
        public int i;
        List<int> arr;
        public A() 
        {
            arr = new List<int>();
            i = 10;
            while (i < 1000) {
                i++;
                arr.Add(i);
            }
        }
        ~A() {
            Console.WriteLine("Distructor called!!!");
            arr.Clear();
        }
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            A a = new A();
            int i = 100;
            a = null;
            GC.Collect();
            List<int> mylist= new List<int>();
            while (i < 100000000)
            {
                i++;
                mylist.Add(i);
            }
        }
    }
Добавлено через 18 минут
И ещё, подскажите пожалуйста, если у нас имеется объект A, который содержит всякую всячину и переменную string s; Есть второй объект B, который содержит переменную string j; Во время выполнения программы, j объекта B присваивается s объекта A. И потом A = null. Уничтожится ли вся остальная чаcть A, кроме string s, т.к. она уже недоступна?)
0
Заблокирован
29.03.2013, 10:55
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 class A
    {
        public A() { }
        ~A()
        {
            Console.WriteLine("Distructor called!!!");
        }
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            A a = new A();
            a = null;
            GC.Collect();
            GC.WaitForPendingFinalizers();
            Console.ReadKey();
        }
    }
Добавлено через 17 минут
Цитата Сообщение от orange Посмотреть сообщение
Добавлено через 18 минут
И ещё, подскажите пожалуйста, если у нас имеется объект A, который содержит всякую всячину и переменную string s; Есть второй объект B, который содержит переменную string j; Во время выполнения программы, j объекта B присваивается s объекта A. И потом A = null. Уничтожится ли вся остальная чаcть A, кроме string s, т.к. она уже недоступна?)
Правило: уничтожается все, на что нет ссылки. Уничтожится все кроме s.
1
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
29.03.2013, 12:07
Цитата Сообщение от orange Посмотреть сообщение
Подскажите пожалуйста почему не вызывается деструктор объекта "a" при вызове GC.Collect()
GC.Collect() запускает финализаторы в фоновом потоке, и не ждет пока они все выполнятся. Если чуть подождать надпись появляется
C#
1
2
3
4
            A a = new A();
            a = null;
            GC.Collect();
            Thread.Sleep(10000);
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.03.2013, 12:07
Помогаю со студенческими работами здесь

Освобождение ресурсов OpenGL при закрытии программы
если закрывать прогу через клавишу Esc (код ниже)то память освобождается но если через системное меню - красный крест в правом верхнем...

Освобождение ресурсов при получении терминирующего сигнала
Здравствуйте уважаемые. Я только изучаю Си, и столкнулся с такой проблемой. Допустим пишу я сокет - сервер, предполагается, что...

Освобождение ресурсов
В гугле много полемики на эту тему, но вот решения я так и не нашел. В случае, когда активити убивается(т.е. без вызова onDestroy), где...

Освобождение ресурсов try with resources
Объясните пожалуйста что я делаю не так ? Таким образом я обращаюсь к базе данных Эта не рабочая версия кода public ...

Освобождение неиспользуемых ресурсов в приложении
Помогите решить проблему!!! В создаваемом приложении появлялась ошибка переполнения памяти, после поиска ответа на форумах нашёл в...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG-файла с альфа-каналом с помощью библиотеки SDL3_image на Android
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru