Otrzymuję nieoczekiwany błąd naruszenia zasad dostępu w poniższym kodzie:Strange AV podczas przechowywania odwołanie Delphi interfejsu
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.
wiem, że interfejsy powinny być wykorzystywane w różny sposób. Pracuję jednak nad dotychczasową bazą kodową, która wykorzystuje to podejście. Byłem bardzo zaskoczony widząc, że nie wystarczy zarezerwować pamięć SizeOf (ITest), aby umieścić tam ITest.
Teraz ciekawie gdybym zmienić pierwszą linię do
GetMem(p, 21);
niż AV nie ma. (20 bajtów lub mniej nie powiedzie się). Jakie jest tego wytłumaczenie?
(używam Delphi XE2 Aktualizacja 4 + poprawką)
Proszę nie komentować, jak straszne jest kod lub sugerować, jak to może być odpowiednio kodowane. Zamiast tego proszę odpowiedzieć, dlaczego konieczne jest zarezerwowanie 21 bajtów zamiast SizeOf (ITest) = 4?
AV = naruszenie zasad dostępu? – kol
Twój kod wygląda naprawdę dziwnie. Dlaczego potrzebujesz "^ ITest" i pary GetMem/FreeMem? TTest jest potomkiem TInterfacedObject, więc p powinno być po prostu ITestem. Jest liczony z odwołaniem, więc zostanie automatycznie zniszczony, gdy wyjdzie poza zakres. Nie ma potrzeby używania GetMem/FreeMem. – kol
To jest całkowicie nieprawidłowy sposób pracy z interfejsami. Czy możesz wyjaśnić, co masz nadzieję osiągnąć, aby być może ktoś wskazał ci lepszy kierunek? –