Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 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 Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: VoVa (статус: Посетитель)
Вопрос отправлен: 4 января 2012, 16:23
Состояние вопроса: решён, ответов: 0.


Мини-форум вопроса

Всего сообщений: 7; последнее сообщение — 5 января 2012, 21:15; участников в обсуждении: 4.
min@y™

min@y™ (статус: Доктор наук), 4 января 2012, 16:34 [#1]:

Цитата (VoVa):

когда я его хочу разрушить вызывая метод Free поулчается следующее - класс разрушается, но если обратиться к переменной, которая содержала ссылку на этот класс она содержит значение вместо NIL

Так и быть должно и всегда так было. Деструктор не обнуляет переменную, а только освобождает память из-под самого экземпляра класса. Переменных, кстати, указывающих на один и тот же экземпляр, может быть несколько, это же просто указатель и всё.
Поэтому, если надо обнулять сам указатель, юзай процедеру FreeAndNil() или обнуляй вручную, присваивая ей значение nil.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
DNK

DNK (статус: Студент), 4 января 2012, 16:53 [#2]:

Цитата:

класс разрушается

Сильно сказано! Разрушается не класс, а объект класса.
"Digital Networked Knight"
VoVa

VoVa (статус: Посетитель), 4 января 2012, 16:57 [#3]:

А что по поводу String массива его надо освобождать вручную? Или деструктор сам его освободит?
VoVa

VoVa (статус: Посетитель), 4 января 2012, 17:09 [#4]:

Да и кстати, почему я задал вопрос про разрушение объекта класса, ибо если я беру Edit на форме и делаю ему Free, то после этого Watch List показывает, что там NIL!

Так в чём же разница метода Free для Edit-a и метода Free для TObject?
bugmenot

bugmenot (статус: 3-ий класс), 4 января 2012, 21:12 [#5]:

а если бы было три ссылки на один экземпляр?

Цитата (VoVa):

Да и кстати, почему я задал вопрос про разрушение объекта класса, ибо если я беру Edit на форме и делаю ему Free, то после этого Watch List показывает, что там NIL!

потому, что контейнер ТForm является владельцем всех компонентов и получает уведомление об освобождении
см. TComponent.Notification
виконання програми розпочинається з того самого мiсця, де призупинилося.

VoVa

VoVa (статус: Посетитель), 5 января 2012, 09:53 [#6]:

Всем спасибо за ответы!

5 января 2012, 09:54: Статус вопроса изменён на решённый (изменил автор вопроса — VoVa)

DNK

DNK (статус: Студент), 5 января 2012, 21:15 [#7]:

По правде говоря, в деструкторе динамические массивы не обязательно обнулять. Они уничтожатся автоматически в процессе уничтожения объекта, если на них не будет других ссылок.
"Digital Networked Knight"

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:42
Выполнено за 0.03 сек.