Удаление обьекта Set obj=nothing

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Fedorfx
Постоялец
Постоялец
 
Сообщения: 371
Зарегистрирован: 10.10.2002 (Чт) 0:14

Удаление обьекта Set obj=nothing

Сообщение Fedorfx » 27.10.2003 (Пн) 22:03

Всем привет.
Как узнать сколько обьектов ссылается на обьект.
Ведь если число ссылок больше 1 то по Set obj=nothing не удалит обьект и он будет работать в памяти ( это я так думаю)
P/S Вообще интересует проблемма освобождения ресурсов и котроль над этими процессами.

Dmitriy2003
Постоялец
Постоялец
 
Сообщения: 690
Зарегистрирован: 27.05.2003 (Вт) 22:47
Откуда: Deutschland

Сообщение Dmitriy2003 » 27.10.2003 (Пн) 23:45

Механизм учета ссылок скрыт от программиста на VB.
Правда всегда есть молоток -> if not objTemp is nothing then set objTemp = nothing.
Dmitrich

Fedorfx
Постоялец
Постоялец
 
Сообщения: 371
Зарегистрирован: 10.10.2002 (Чт) 0:14

Сообщение Fedorfx » 28.10.2003 (Вт) 0:48

А зачем проверка то???
Я всегда пишу Set obj=Nothing - без проверок - и ошибки не дает. Что то не так???
Пример моего глюка.

Form1.controls.add Class1 ( Добавляю UserControl)
В форме Class2 Содержит ссылки на все дабавленные UserControl.
В Каждом Class1 Есть Class 3 в котором есть ссылка на Class 1 ( для вывода на форму UserControl инфы) итд
Так вот
Form1_Unload
Set Class2(i)=nothing - Sub Class_Terminate не вызывается
form1.Controls.remove Class1 - Sub Class_Terminate не вызывается
Форма исчезает с экрана а Usercontrol продолжает пахать.
P/S Знаю что есть еще Class3 c ссылкой на Usercontrol но как заставить его терминатится без вызова термината основного Usercontrol в голову не приходит.

Dmitriy2003
Постоялец
Постоялец
 
Сообщения: 690
Зарегистрирован: 27.05.2003 (Вт) 22:47
Откуда: Deutschland

Сообщение Dmitriy2003 » 28.10.2003 (Вт) 2:28

2 Fedorfx - "А зачем проверка то???"
----------------------------------------------
Исключительно для примера. :wink:
----------------------------------------------
P.s - Можно воспользоваться указателем на обект и обойти механизм учета ссылок но для твоей задачи заранее утверждать что это то что нужно я бы не стал.... :roll:
Dmitrich

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 28.10.2003 (Вт) 9:41

Была у нас дискуссия на эту тему, называлась "Чистота программного кода: уничтожение объектов" :)

Так вот, объект херится не из VB. Его херит COM по факту отсутствия указателей на него. Кол-во таких указателей не проверишь. Но, т.к. все указатели создаются программером, то уничтожение объекта будет гарантировано умелым расставлением set = nothing.

К примеру, создаём объект А. После этого создаём объект B. Одним из членов класса А является ссылка на B. Аналогично, один из членов B есть ссылка на А. В этом случае set b=nothing не приведёт к уничтожению объекта. А если сделать ещё и set a=nothing, то возникнет ситуация, когда оба объекта будут существовать в памяти, нно достучаться до них нельзя уже никак. И будут они там до завершения родительского процесса. Решение: предусмотреть в объекте B friend sub, которая обнуляет внутренние указатели B, и только после этого делать set b=nothing и set a.b=nothing.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex-бот и гости: 4

    TopList