|
Вопрос # 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"
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|