Recibo un error inesperado Violación de acceso en el siguiente código:AV extraño cuando se almacena una referencia Delphi interfaz
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.
sé que las interfaces deben ser utilizados de manera diferente. Sin embargo, estoy trabajando en una base de código heredada que utiliza este enfoque. Y estuve muy sorprendido de ver que no es suficiente reservar la memoria SizeOf (ITest) para poner allí un ITest.
Ahora interesante si cambio de la primera línea a
GetMem(p, 21);
que el AV se ha ido. (20 bytes o menos falla). ¿Cuál es la explicación para esto?
(estoy usando Delphi XE2 Update 4 + Revisión)
Por favor, no hacer comentarios sobre lo horrible que el código es ni sugiere cómo esto podría ser codificado correctamente. En su lugar, responda por qué es necesario reservar 21 bytes en lugar de SizeOf (ITest) = 4?
AV = violación de acceso? – kol
Tu código se ve realmente extraño. ¿Por qué necesita "^ ITest" y el par GetMem/FreeMem? TTest es un descendiente de TInterfacedObject, por lo que p debería ser simplemente un ITest. Se cuenta de referencia, por lo que se destruirá automáticamente cuando se salga del alcance. No es necesario usar GetMem/FreeMem. – kol
Esta es la forma totalmente incorrecta de trabajar con interfaces. ¿Puedes explicar qué es lo que esperas lograr, para que alguien pueda orientarte en una mejor dirección? –