| 
| 
 | Вопрос # 5 861/ вопрос решён / | 
 |  Здравствуйте, уважаемые эксперты!
 Никак не могу понять следующее. Есть класс:
 TStringMatrix = class(TObject)
 
 Класс работает всё отлажено, но когда я его хочу разрушить вызывая метод Free поулчается следующее - класс разрушается, но если обратиться к переменной, которая содержала ссылку на этот класс она содержит значение вместо NIL
 
 Ниже приведен код деструктора:
 
 destructor TStringMatrix.Destroy;
 var
 i : Word;
 begin
 if fRows > 0 then begin
 for i := 0 to Length(mtxElements)-1 do begin
 SetLength(mtxElements[i], 0);
 end;
 SetLength(mtxElements, 0);
 end;
 
 inherited;
 end;
 
 
 И еще в данном классе объявлено :
 mtxElements: Array of Array of string;
 нужно ли его освобождать вручную в деструкторе  или деструктор сам все сделает?
 
|  |   Вопрос задал: VoVa (статус: Посетитель)Вопрос отправлен: 4 января 2012, 16:23
 Состояние вопроса: решён, ответов: 0.
 |  
 Мини-форум вопросаВсего сообщений: 7; последнее сообщение — 5 января 2012, 21:15; участников в обсуждении: 4. 
|   | min@y™ (статус: Доктор наук), 4 января 2012, 16:34 [#1]: Цитата (VoVa): когда я его хочу разрушить вызывая метод Free поулчается следующее - класс разрушается, но если обратиться к переменной, которая содержала ссылку на этот класс она содержит значение вместо NIL Так и быть должно и всегда так было. Деструктор не обнуляет переменную, а только освобождает память из-под самого экземпляра класса. Переменных, кстати, указывающих на один и тот же экземпляр, может быть несколько, это же просто указатель и всё.
 Поэтому, если надо обнулять сам указатель, юзай процедеру FreeAndNil() или обнуляй вручную, присваивая ей значение nil.
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | DNK (статус: Студент), 4 января 2012, 16:53 [#2]: Цитата: класс разрушается Сильно сказано! Разрушается не класс, а объект класса.
 "Digital Networked Knight" |  
|   | VoVa (статус: Посетитель), 4 января 2012, 16:57 [#3]:А что по поводу String массива его надо освобождать вручную? Или деструктор сам его освободит? |  
|   | VoVa (статус: Посетитель), 4 января 2012, 17:09 [#4]:Да и кстати, почему я задал вопрос про разрушение объекта класса, ибо если я беру Edit на форме и делаю ему Free, то после этого Watch List показывает, что там NIL! 
 Так в чём же разница метода Free для Edit-a и метода Free для TObject?
 |  
|   | bugmenot (статус: 3-ий класс), 4 января 2012, 21:12 [#5]:а если бы было три ссылки на один экземпляр? 
 
 Цитата (VoVa): Да и кстати, почему я задал вопрос про разрушение объекта класса, ибо если я беру Edit на форме и делаю ему Free, то после этого Watch List показывает, что там NIL! потому, что контейнер ТForm является владельцем всех компонентов и получает уведомление об освобождении
 см. TComponent.Notification
 виконання програми розпочинається з того самого мiсця, де призупинилося.
 
 |  
|   | VoVa (статус: Посетитель), 5 января 2012, 09:53 [#6]:Всем спасибо за ответы! |  5 января 2012, 09:54: Статус вопроса изменён на решённый (изменил автор вопроса — VoVa) 
|   | DNK (статус: Студент), 5 января 2012, 21:15 [#7]:По правде говоря, в деструкторе динамические массивы не обязательно обнулять. Они уничтожатся автоматически в процессе уничтожения объекта, если на них не будет других ссылок. "Digital Networked Knight" |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |