среда, 31 мая 2017 г.

#1355. Получаем AV при создании интерфейсов

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 уже освобождён


2 комментария:

  1. Анонимный31 мая 2017 г., 8:46

    А что удивительного?

    ОтветитьУдалить
    Ответы
    1. Да ничего удивительного конечно. Всё ожидаемо. Это просто рафинированный пример. Может вдруг кому будет полезно. Нерафинированный пример "из жизни" - уж очень лень было с телефона набивать. Ну если глупость - так я на истину нигде и не претендую.

      Удалить