У меня возникло сомнение в том, что вы освободите объект сопряжения.Освобождение связанного объекта
Мой интерфейс выглядит следующим образом:
type IBase = interface(IInterface)
function test: Boolean;
end;
Это другой класс имеет некоторые атрибуты, которые я хотел во всех сопряженных классов:
type TBase = class(TInterfacedObject)
protected
FQuery: TADOQuery;
FADOConnection: TADOConnection;
public
constructor Create; virtual; abstract;
destructor Destroy;
end;
Я получил некоторые clases, которые наследуются от предыдущего класса и также реализует интерфейс.
type TExample= class(TBase, IBase)
public
function test: Boolean;
destructor Destroy;
end;
Таким образом, с помощью этой схемы я могу использовать классы, как это:
procedure someProcedure(aux : IBase);
begin
aux.test; //Aux is an instance of TExample and I'm using the interfaced method
end;
Мой вопрос, как я уничтожу этот Окс объект, который является IBase interfacedObject? Я попробовал это вещи, проверяя первое, что не является нулевой объект:
(aux as TObject).Destroy; //Invalid Pointer operation
(aux as TInterfacedObject).Destroy; //Invalid Pointer operation
(aux as TExample).Destroy; Also invalid Pointer operation!!??
Вместо того, чтобы освободить объект, я прочитал, что, поскольку наследует от TInterfacedObject и реализует интерфейс я должен использовать это:
aux := nil;
И счетчик ссылок будет делать магию, но используя ReportMemoryLeaksOnShutdown: = True; в моем проекте есть некоторые утечки, и код никогда не достигает точки останова деструктора.
Я что-то не хватает ???
EDIT:
Я изменил мои конструкторы, теперь как:
type TBase = class(TInterfacedObject)
protected
FQuery: TADOQuery;
FADOConnection: TADOConnection;
public
constructor Create;
destructor Destroy; override;
end;
type TExample= class(TBase, IBase)
public
function test: Boolean;
end;
Теперь я думаю, что больше смысла, так как TBase является выделение и освобождение объектов и класс TExample наследует деструктор.
Вам нужно добавить 'override;' в декларацию 'destructor'. Кроме этого, вам не нужно ничего делать, чтобы освободить объект. –
То есть ... задайте вопрос, и я дам вам правильный ответ ... спасибо! – Izuel
Этого недостаточно. Он все равно не сработает –