最终,我可能会收到该类型的另一个实例,并且第一个实例必须被丢弃并替换为新实例。为此,我需要释放接口对象使用的内存(我的接口提供了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.
所以问题是:我如何正确释放那个对象?
TComponent
没有使用引用计数;AddRef
和Release
返回-1。 - David Heffernan_AddRef
和_Release
的实现来不对其进行计数),但无法禁用编译器生成对引用计数函数的调用。由于这些函数总是会被调用,因此在销毁接口变量所引用的对象之前,即使你不打算计数引用,仍需要确保没有剩余引用。 - Rob Kennedy