Утечка памяти при использовании RemObjects и COM-объектов через Delphi

У меня есть веб-сервис, созданный с помощью RemObjects SDK поверх Delphi XE, и опубликована функция, которая для его работы должна использовать com-объекты (в частности, Ado-соединение с базой данных с использованием DMO). Я обнаружил, что когда я вызываю эту функцию много раз, память, которая использует веб-сервис, резко увеличивается.

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

Что я должен сделать, чтобы это исправить?

Спасибо

Код:

constructor TA.Create;
begin
    inherited Create;
    oServer := CoSQLServer.Create;
end;

destructor TA.Destroy;
begin
   oServer := nil;
end;

декларация

class function CoSQLServer.Create: _SQLServer;
begin
    Result := CreateComObject(CLASS_SQLServer) as _SQLServer;
end;

1 ответ

В показанном вами коде единственное, что мы можем критиковать, это ваш деструктор:

destructor TA.Destroy;
begin
  oServer := nil;
end;

Назначение nil в oServer довольно бессмысленно (хотя и безвредно), так как это произойдет автоматически.

Но здесь не хватает вызова унаследованного деструктора. Итак, ваш деструктор должен выглядеть так:

destructor TA.Destroy;
begin
  oServer := nil;
  inherited;
end;

Теперь, если вы решили удалить финализацию oServer тогда вы можете просто удалить деструктор из вашего класса и положиться на него из базового класса.

Однако вы, похоже, измеряете утечку памяти с помощью недопустимого инструмента. Вы не можете измерить утечки памяти с помощью диспетчера задач. Используйте детектор утечки FastMM.

Другие вопросы по тегам