Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Паттерн фабрики и создание интерфейсов в Delphi: особенности работы счетчика ссылок

Delphi , Программа и Интерфейс , Интерфейс

Вопрос, поднятый в данном запросе, связан с особенностями работы с интерфейсами в Delphi, в частности, с поведением счетчика ссылок при использовании паттерна фабрики. Разберемся с этим вопросом подробнее.

Проблема

При работе с фабричным паттерном в Delphi был замечен неожиданный рост счетчика ссылок интерфейса. Автор запроса столкнулся с ситуацией, когда при вызове метода фабрики внутри процедуры, счетчик ссылок интерфейса был равен 1, в то время как при вызове из основной программы — 2. Это поведение было протестировано в Delphi 10 Seattle, и разработчик не мог понять, что вызывает такое поведение.

Контекст

В контексте запроса представлен пример кода, в котором определены интерфейс IMyInterface, класс TMyObject, наследующий TInterfacedObject и реализующий IMyInterface, а также фабрика TMyFactory, возвращающая интерфейс нового объекта. В коде присутствуют два блока: один, где счетчик ссылок равен 1, и другой — где он равен 2. В первом случае интерфейс создается и возвращается напрямую, во втором — через вызов функции @IntfCopy, что, по всей видимости, и вызывает создание дополнительной ссылки.

Подтвержденный ответ

Из предоставленного описания проблемы и контекста можно сделать вывод, что компилятор Delphi ведет себя по-разному в зависимости от того, где происходит создание интерфейса: в локальной переменной или в глобальной. Когда интерфейс создается в локальной переменной, компилятор доверяет, что присваивание пройдет успешно, и дополнительная ссылка не создается. В случае с глобальными переменными компилятор более осторожен и генерирует дополнительный код для защиты от возможных ошибок, создавая дополнительную ссылку.

Альтернативный ответ

Дополнительно стоит отметить, что подобное поведение компилятора наблюдается и в других сценариях, например, при использовании оператора приведения типов as. В этом случае компилятор также создает дополнительную ссылку на интерфейс, так как приведение может вызвать исключение.

Примеры кода

Для демонстрации проблемы и ее понимания приведем примеры кода на Object Pascal (Delphi):

program TestRefCount;
{$APPTYPE CONSOLE}
{$R *.res}
uses
  System.SysUtils,
  Vcl.Dialogs;

type
  IMyInterface = interface(IInterface)
    ['{62EB2C46-9B8A-47CE-A881-DB96E6F6437D}']
    procedure DoSomething;
    function GetRefCount: Integer;
  end;

  TMyObject = class(TInterfacedObject, IMyInterface)
  strict private
    FMyValue: Integer;
  public
    procedure Init;
    procedure DoSomething;
    function GetRefCount: Integer;
  end;

  TMyFactory = class(TObject)
  private
    function CreateMyInt: IMyInterface;
  end;

// Остальная часть кода класса TMyObject и TMyFactory опущена для краткости

function TMyFactory.CreateMyInt: IMyInterface;
var
  myObject: TMyObject;
begin
  myObject := TMyObject.Create;
  try
    myObject.Init;
    Result := myObject; // Здесь может быть создан дополнительный счетчик ссылок
  except
    on E: Exception do
    begin
      myObject.Free;
      Raise;
    end;
  end;
end;

procedure WorkWithIntf;
var
  myFactory: TMyFactory;
  myInt: IMyInterface;
begin
  myFactory := TMyFactory.Create;
  try
    myInt := myFactory.CreateMyInt;
    // Код работы с интерфейсом
  finally
    myFactory.Free;
  end;
end;

begin
  // В этом случае счетчик ссылок равен 1
  WorkWithIntf;

  // В этом случае счетчик ссылок равен 2
  var
    myInt: IMyInterface;
  begin
    myInt := TMyFactory.CreateMyInt; // Предполагаем, что TMyFactory уже объявлен в глобальной области видимости
    // Код работы с интерфейсом
  end;
end.

Заключение

При работе с фабричным паттерном и интерфейсами в Delphi важно учитывать особенности работы счетчика ссылок, которые могут быть вызваны компилятором в зависимости от контекста создания интерфейса. Разработчикам следует быть внимательными к таким деталям, чтобы избежать утечек памяти и других проблем, связанных с неправильным управлением ссылками на объекты.

Создано по материалам из источника по ссылке.

Вопрос связан с нюансами работы счетчика ссылок интерфейсов в Delphi при использовании паттерна фабрики, где наблюдается неожиданное увеличение счетчика ссылок в зависимости от контекста выполнения кода.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Интерфейс ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-02-05 14:52:35/0.0055930614471436/1