type ISomeInterface = interface function Ptr: Pointer; end;//ISomeInterface TSomeInterface = class(TInterfacedObject, ISomeInterface) f_Ptr: Pointer; function Ptr: Pointer; constructor Create(aPtr: Pointer; aSize: Integer); destructor Destroy; override; end;//TSomeInterface function TSomeInterface.Ptr: Pointer; begin Result := f_Ptr; end; constructor TSomeInterface.Create(aPtr: Pointer; aSize: Integer); begin inherited Create; GetMem(f_Ptr, aSize); Move(f_Ptr^, aPtr^, aSize); end; destructor TSomeInterface.Destroy; begin FreeMem(f_Ptr); f_Ptr := nil; inherited; end; const C : array [0..2] of Char = 'ABC'; var A : ISomeInterface; P : Pointer; A := TSomeInterface.Create(@C, SizeOf(C)); P := A.Ptr; A := TSomeInterface.Create(@C, SizeOf(C)); A := TSomeInterface.Create(P, SizeOf(C)); // - AV !!! Потому, что предыдущий A уже освобождён
Заметки о тестировании, программировании и прочий "поток сознания", который жалко писать "в стол"
А что удивительного?
ОтветитьУдалитьДа ничего удивительного конечно. Всё ожидаемо. Это просто рафинированный пример. Может вдруг кому будет полезно. Нерафинированный пример "из жизни" - уж очень лень было с телефона набивать. Ну если глупость - так я на истину нигде и не претендую.
Удалить