В какой-то части моего приложения, У меня есть ситуация, когда я получаю интерфейс, который, как я знаю, является объектом, хотя я не знаю точного класса. Я должен сохранить этот объект в переменной типа интерфейса.
В конце концов, я могу получить другой экземпляр этого типа, и первый должен быть отброшен и заменен новым. Для этого мне нужно освободить память, которую использует интерфейсный объект (мой интерфейс предоставляет метод AsObject, поэтому я могу использовать на нем методы TObject). Моя проблема в том, что когда я снова хочу присвоить этой переменной «nil», я получаю нарушение прав доступа.
Я написал небольшую программу, которая воспроизводит мою ситуацию. Я размещаю его здесь, чтобы прояснить ситуацию.
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils, Classes;
type
ISomeInterface = interface
function SomeFunction : String;
function AsObject : TObject;
end;
TSomeClass = class(TComponent, ISomeInterface)
public
called : Integer;
function SomeFunction : String;
function AsObject : TObject;
end;
var
SomeInterface : ISomeInterface;
i : Integer;
function TSomeClass.SomeFunction : String;
begin
Result := 'SomeFunction called!';
end;
function TSomeClass.AsObject : TObject;
begin
Result := Self;
end;
begin
try
SomeInterface := nil;
for i := 1 to 10 do
begin
if SomeInterface <> nil then
begin
SomeInterface.AsObject.Free;
SomeInterface := nil; // <-- Access Violation occurs here
end;
SomeInterface := TSomeClass.Create(nil);
SomeInterface.SomeFunction; // <-- if commented, Access
// Violation does not occur
end;
except on e : Exception do
WriteLn(e.Message);
end;
end.
Итак, вопрос: как я могу правильно освободить этот объект?