我在以下代码中收到意外的访问冲突错误:
program Project65;
{$APPTYPE CONSOLE}
{$R *.res}
uses
SysUtils;
type
ITest = interface
end;
TTest = class(TInterfacedObject, ITest)
end;
var
p: ^ITest;
begin
GetMem(p, SizeOf(ITest));
p^ := TTest.Create; // AV here
try
finally
p^ := nil;
FreeMem(p);
end;
end.
我知道接口应该以不同的方式使用。但是,我正在研究使用这种方法的遗留代码库。而且我很惊讶地看到保留 SizeOf(ITest) 内存来放置 ITest 是不够的。
现在有趣的是,如果我将第一行更改为
GetMem(p, 21);
比AV消失了。(20 字节或更少失败)。对此有何解释?
(我正在使用 Delphi XE2 Update 4 + HotFix)
请不要评论代码有多可怕或建议如何正确编码。请回答为什么需要保留 21 个字节而不是 SizeOf(ITest) = 4?