Утечка памяти при использовании 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.