вызывается деструктор, если вызывать через Free.
Пишу свой класс, от TObject. В нем есть конструктор и деструктор, и там производится работа по выделению и освобождению ресурсов.
Объект этого класса создается в OnCreate формы, и разрущается в OnDestroy формы. Разрушается путем вызова метода Free.
Оказалось, что Free не вызывает деструктор. Если вызвать непосредственно Destroy - все работает Ок.
TClientDataSet = class
...
public
...
constructor Create;
destructor Destroy; override;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
CDS.Free; // не приводит к вызову CDS.Destroy;
CDS.Destroy; // а так - работает.
end;
procedure TObject.Free;
begin
// the call via self avoids a warning
if self<>nil then
self.destroy;
end;
Чего не хватает что бы при Free (методе предка) вызвался Destroy наследника, через который производится вызов.
Где-то что-то с self?
Нет текста конструктора и точно ли он вызывается)
Конструктор точно вызывается, все работает. Просто утекают ресурсы из-за невызова Destroy. constructor TClientData.Create; begin inherited Create; // FieldsDefs := TClientDataFields.Create; FieldsWork := TClientDataFields.Create; FDataList := TList.Create; end;
То что классы разные TClientDataSet и TClientData, это описка?
Второе - точная копипаста, первое писал "из головы", точности названию класса не придавал значения. Естественно, название класса в реале правильное. Повторюсь - все компиляется, все работает.
Чудес не бывает, скорее всего селф уже нил
А что я сделал не так что self стал nil? МОжет быть, для того что бы в self что-то было, нужно что-то сделать, по дефолту оно не фурычит?
Ну и судя по коду Free - либо self не тот, либо Destroy не мой а родителя.
Inherited?
К какому месту прикладывать этот Inherited?
к вызову вышестоящего деструктора
Так мне нужен не вышестоящий деструктор а мой, потомкинский, от объекта к которому я Free делаю.
тогда явно вызови. возможно класс 'не чувствует' TMyClass(intance).Free
А сохдаеш та точно свой объект? Давай минимальный пример
Пример завтра видимо сделаю, сейчас уже не на работе.
ок. кидай пример. потому как непонятно что там
в дестрой вестимо. Ты же оверрайдишь метод?
Естественно. Объявлен как override, и в конце моего Destroy вызывается inherited Destroy;
а где? в первоначальном посте я этого не увидел 👁
На свежую голову оказалось что: - через вызов Free вызывается нужный Destroy - в юните 2 дестроя от разных классов, видимо ловил бряк не в том дестрое :) - утечка была потому что в одном из двух дестроев забыл написать Clear который собственно данные с ее памятью и отдает. - волшебным образом совпало что количество полей и количество тестовых записей было одинаковым, и поэтому мысль шла по неверному пути. :)
Обсуждают сегодня