我得到了意想不到的訪問衝突錯誤在下面的代碼時:奇怪的AV存儲的德爾福接口引用
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字節或更少失敗)。這是什麼解釋?
(我使用德爾福XE2更新4 +修復)
請不要在代碼是多麼可怕的意見或建議如何這可能是正確編碼。相反,請回答爲什麼需要保留21個字節而不是SizeOf(ITest)= 4?
AV =訪問衝突? – kol
你的代碼看起來很奇怪。爲什麼你需要「^ ITest」和GetMem/FreeMem對? TTest是TInterfacedObject的後代,所以p應該只是一個ITest。它是引用計數的,所以它會在超出範圍時自動銷燬。不需要使用GetMem/FreeMem。 – kol
這是使用接口的完全不正確的方式。你能解釋一下你希望完成的是什麼嗎?也許有人能指出你朝着更好的方向發展? –