В Delphi я запускаю унаследованный класс из базового класса, который уже создан. Я считаю, что это разделяет адреса базового класса между этими двумя классами, но дополнительные члены унаследованного класса получают дополнительную память, выделенную для них, но не инициализируются.Delphi Cast: утечка памяти?
Если освобожден общий базовый класс, это вызывает утечку памяти для членов класса Inherited?
Если да, то каков наилучший способ очистки унаследованных классов, если я хочу оставить базовый класс нетронутым?
program Project1;
uses
SysUtils;
type
TBase = class(TObject)
public
basemember : string ;
Constructor Create() ;
end;
TInherited = class(TBase)
public
inheritedmember : string ;
Constructor Create() ;
end ;
Constructor TBase.Create() ;
begin
basemember := 'Basemember' ;
Writeln ('basemember') ;
end ;
Constructor TInherited.Create() ;
begin
inheritedmember := 'inheritedmember' ;
Writeln ('inheritedmember') ;
end ;
var
baseclass : TBase;
castbaseclass : TInherited;
begin
Writeln ('Base Class');
baseclass := TBase.Create();
Writeln ('');
Writeln ('Cast Inherited Class');
castbaseclass := TInherited(baseclass);
baseclass.Free; //memory leak?
ReadLn;
end.
Я предполагаю, чтобы получить унаследованные переменные члены должны быть выделены, унаследованный класс должен быть создан с помощью 'new' - но тогда есть ли способ, чтобы базовый компонент унаследованного класса указывал на уже существующий экземпляр базового класса? – Retiarius
Нет на обоих счетах. Вы выделяете экземпляры классов вызовом конструкторов, а не вызовом new. И нет, вы не можете накладывать один экземпляр на другой. Ну, теоретически может быть возможно с какой-то формой распределения пользовательских экземпляров. Но это было бы безумным и непрактичным. Может быть, я даже не должен был упоминать об этом! –
У вас явно есть неправильная ментальная модель для всего этого. Я рекомендую вам потратить немного времени на исправление этой ментальной модели. –