0

DelphiXE上でRemObjectsSDKを使用して作成されたWebサービスがあり、彼の作業を行うにはcomオブジェクト(具体的にはDMOを使用したデータベースへのAdo接続)を使用する必要がある関数が公開されています。この関数を何度も呼び出すと、Webサービスを使用するメモリが劇的に増加することがわかりました。

メモリリークの原因は、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;
4

1 に答える 1

1

あなたが示すコードでは、私たちが批判できる唯一のものはあなたのデストラクタです:

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

への割り当ては、自動的に行われるため、(無害ではありますが) かなり無意味ですniloServer

しかし、ここで欠けているのは、継承されたデストラクタへの呼び出しです。したがって、デストラクタは次のようになります。

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

ここで、ファイナライズを削除することにした場合は、oServer単純にクラスからデストラクタを削除して、基本クラスのデストラクタに依存することができます。

ただし、無効なツールを使用してメモリ リークを測定しているようです。タスク マネージャーでメモリ リークを測定することはできません。FastMM リークディテクターを使用します。

于 2012-12-28T21:08:56.267 に答える