8

私は主に C++ プログラマーであり、オブジェクトの所有権を表すためstd::unique_ptrに、 などのクラス テンプレートを使用することに慣れてきました。std::shared_ptrDelphi の標準ライブラリには、類似したものがありますか? コードを書くときに従うべき、オブジェクトの所有権を表現するためのベストプラクティスはありますか?

編集: C++11 が標準になったため、2 つの軽量ヘルパー クラスstd::shared_ptrstd::unique_ptr.

type の変数を作成するとstd::shared_ptr<int>、それは共有所有権を持つ int へのポインターを表します。フードの下では参照カウントが行われ、ref-count がゼロに達すると、ポインターは自動的に解放されます。このタイプは一種の「共有所有権」を表しており、多くのオブジェクトがリソースを使い終わったときにそのリソースを破棄する責任を共有しています。

対照的に、std::unique_ptr単一の所有権を表します。unique_ptr が範囲外になると、リソースは自動的に解放されます。std::unique_ptr はコピーできません。一度にこのリソースを所有するオブジェクトが 1 つだけ存在する可能性があり、オブジェクトのクリーンアップを担当するオブジェクトが 1 つだけ存在します。

これらの軽量クラスを int へのネイキッド ポインターと対比してください。共有所有権、一意の所有権、または別の場所のオブジェクトへの参照を表すことができます。タイプは何も教えてくれません。

私の質問は次のとおりです。Delphi はオブジェクトへの参照の保持をサポートしているため、「私はこのオブジェクトの唯一の所有者です。処理が完了したら解放します」と明示的に述べるメカニズムはありますか?相互作用の目的でこのオブジェクトを参照しますが、他の誰かがそれをクリーンアップします" vs "私はこのオブジェクトを他の多くのオブジェクトと共有しており、最後にそれを持っている人は誰でもそれをクリーンアップできます."

TListCollections.Generics にはvsなどのさまざまなコレクションがTObjectListあり、TObjectList はその中に格納されているメンバーを解放しますが、TList は解放しません。TObjectList はその要素を「所有」しているのに対し、TList は所有していないと言えます。これが私の質問の本質です。独自のクラスを設計する場合、この種の所有権の問題を言語内で直接表現する方法はありますか? または、開発者の間で一般的なベスト プラクティスや命名規則はありますか?

4

3 に答える 3

4

役立つ言語構造や「標準の命名規則」については知りません。

ただし、クラスが適切にクリーンアップされているかどうかを簡単に確認できるようにするために、私はずっと前に次の命名規則を採用しました。

  • 標準の Delphi 規則に従って、すべてのフィールド名は「F」で始まります。
  • クラスがライフタイム管理の責任を負う/引き受けるオブジェクト参照は、「FMy」で始まります。
  • デストラクタで nil への参照を設定することにより、クラスが明示的に解放する必要があるインターフェイス参照 (パフォーマンスのため、循環依存関係を破るためなど) は、「FMi」で始まります。

非常に粗雑ですが、機能し、しばらく見ていないコードを実行するときに、「待って、その参照を解放または無効にするべきではありませんか?」というようなことを防ぐのに大いに役立ちました。検索します。

于 2013-09-12T18:07:56.057 に答える
1

Delphi の概念は、多くの場合 C++ とは異なります。どちらの言語も第 3 世代ですが、Delphi は C++ よりも高いレベルの抽象化に取り組むことを好みます。たとえば、Delphi はポインタをサポートしていますが、C++ の場合と正確には同じではない参照の概念と比較すると、ポインタはめったに使用されません。

Delphi では、オブジェクト変数は実際には参照です(または、より低いレベルの抽象化ではポインタです)。C++ では、オブジェクト変数を宣言すると、コンストラクターがすぐに呼び出されますが、Delphi ではそうではなく、メモリを割り当ててコンストラクターを実行する特定の瞬間に呼び出す必要があります。そのため、C++ と Delphi でのオブジェクトのメモリ管理は、異なるライフ サイクルに条件付けられています。

これはすべて、Delphi のメモリ管理設計スタイルが C++ とは異なることを伝えるためだけに述べたものです。そのため、Delphi には、まさに必要なことを行うヘルパー クラスがありません。ただし、Delphi は、InterfacesC++ には存在しない という名前の概念を提供します (少なくとも、私が以前 C++ を使用していたときはありませんでした)。インターフェイスは、コードを持たないという意味で抽象クラスに似ています。インターフェイスにクラス実装者を提供する必要があり、そのクラスはコードを提供します。ただし、Interfaces探しているものに近い参照カウントメモリ管理を提供してください。

したがって、あなたへの私の答えは次のとおりです。目的に使用できるメモリ管理の観点から Delphi が提供する最も近い言語構造はInterfacesです。ですから、自分なりの結論を得るために、少なくとも少し勉強することをお勧めします。

于 2013-09-12T18:50:39.967 に答える