1

私は構造のようなグラフを持っています。オブジェクトを従来の Delphi の方法で破棄するタイミングが正確にはわかりません。代わりに、参照カウント オブジェクトのようなものを実装したいと考えています。Free の代わりに object.GetReference や object.Release などを使用し、参照カウントにプライベート変数を使用できることはわかっていますが、他に良い方法はありますか?

ありがとう

4

4 に答える 4

15

Delphi プログラムで標準オブジェクトを破棄する正しい方法(場所、順序など)を判断するのに問題がある場合は、代わりに参照カウント オブジェクトまたはインターフェイスを使用してもまったく役に立ちません。

グラフ内のノードが相互に参照を保持する必要があることを理解しています。オブジェクトへの参照が残っていない場合は、自動的に破棄する必要があります。しかし、2 つのノードがそれぞれ他のノードへの参照を持つことができ、参照カウントが再び 0 に達することはないため、これらのオブジェクトが解放されることはないという事実を考慮してください。参照/依存関係の少なくとも 1 つを手動で解除する必要があります。とにかくこれを行う必要がある場合は、参照カウントを完全にスキップすることもできます。詳細については、弱参照に関するウィキペディアの記事を参照してください。インターフェイスは Delphi で参照カウントに使用できますが、弱参照は巧妙な型キャストによってのみ維持できます。例については、このソース コードとそのコメントを参照してください。

オブジェクトの標準的なライフタイム管理を維持し、代わりにグラフ オブジェクトに依存関係を追跡させるというアイデアを検討することをお勧めします。

各グラフ オブジェクトに、接続している他のオブジェクトのリストを持たせます。これで、任意のオブジェクトを簡単に解放できるようになり、リストのハウスキーピング コードによって、破棄されるオブジェクトへのすべての参照が他のすべてのオブジェクトから削除されます。グラフを変更したい場合は、削除したいノードを解放するだけで、依存関係が更新されます。グラフ全体を破棄したい場合は、すべてのノードを破棄してください。基本的に、ノード (所有権、有効期間管理) のリストと、グラフを記述するための別のデータ構造があります。

于 2009-01-28T12:05:59.437 に答える
3

オブジェクトの代わりにインターフェイスを使用できます。下にあるオブジェクトは自動的に参照カウントされます。また、refcount = 0 の場合、Delphi がオブジェクトを破棄するのが最善の方法です。

于 2009-01-28T11:53:36.233 に答える
2

ご存じのとおり、Delphi にはガベージ コレクタがありません。

オブジェクトを TInterfacedObject から派生させるのが最善の策です。何かのようなもの

type
  IMyObject = interface
    [Guid]
  end;

  MyObject = class(IMyObject, TInterfacedObject)
  end;

var
  myObject: IMyObject;
begin
  myObject := TMyObject.Create;
end

myObject 変数は参照カウントされ、参照カウントがゼロになると解放されます。

于 2009-01-28T11:55:33.547 に答える
2

D2009 を使用している場合は、Barry Kelly のスマート ポインターの実装を使用できます。

http://barrkel.blogspot.com/2008/11/somewhat-more-effective-smart-pointers.html

それ以外の場合は、インターフェイスを使用するのが最善の策です。必要なすべての機能を備えたインターフェイスを作成し、そのインターフェイスを実装して TInterfacedObject から派生するオブジェクトを作成し、オブジェクトではなくあらゆる場所でインターフェイスを使用します。

于 2009-01-28T19:41:08.800 に答える