次のコードで予期しないアクセス違反エラーが発生します。
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.
インターフェースは別の方法で使用する必要があることを知っています。ただし、このアプローチを使用するレガシー コードベースに取り組んでいます。ITest を配置するために SizeOf(ITest) メモリを確保するだけでは不十分であることに非常に驚きました。
興味深いことに、最初の行を次のように変更すると
GetMem(p, 21);
AVがなくなったより。(20 バイト以下は失敗)。これに対する説明は何ですか?
(Delphi XE2 Update 4 + HotFix を使用しています)
コードがいかにひどいものであるかについてコメントしたり、これを適切にコーディングする方法を提案したりしないでください。代わりに、SizeOf(ITest) = 4 ではなく 21 バイトを予約する必要がある理由を教えてください。