私は主に C++ プログラマーであり、オブジェクトの所有権を表すためstd::unique_ptr
に、 などのクラス テンプレートを使用することに慣れてきました。std::shared_ptr
Delphi の標準ライブラリには、類似したものがありますか? コードを書くときに従うべき、オブジェクトの所有権を表現するためのベストプラクティスはありますか?
編集: C++11 が標準になったため、2 つの軽量ヘルパー クラスstd::shared_ptr
とstd::unique_ptr
.
type の変数を作成するとstd::shared_ptr<int>
、それは共有所有権を持つ int へのポインターを表します。フードの下では参照カウントが行われ、ref-count がゼロに達すると、ポインターは自動的に解放されます。このタイプは一種の「共有所有権」を表しており、多くのオブジェクトがリソースを使い終わったときにそのリソースを破棄する責任を共有しています。
対照的に、std::unique_ptr
単一の所有権を表します。unique_ptr が範囲外になると、リソースは自動的に解放されます。std::unique_ptr はコピーできません。一度にこのリソースを所有するオブジェクトが 1 つだけ存在する可能性があり、オブジェクトのクリーンアップを担当するオブジェクトが 1 つだけ存在します。
これらの軽量クラスを int へのネイキッド ポインターと対比してください。共有所有権、一意の所有権、または別の場所のオブジェクトへの参照を表すことができます。タイプは何も教えてくれません。
私の質問は次のとおりです。Delphi はオブジェクトへの参照の保持をサポートしているため、「私はこのオブジェクトの唯一の所有者です。処理が完了したら解放します」と明示的に述べるメカニズムはありますか?相互作用の目的でこのオブジェクトを参照しますが、他の誰かがそれをクリーンアップします" vs "私はこのオブジェクトを他の多くのオブジェクトと共有しており、最後にそれを持っている人は誰でもそれをクリーンアップできます."
TList
Collections.Generics にはvsなどのさまざまなコレクションがTObjectList
あり、TObjectList はその中に格納されているメンバーを解放しますが、TList は解放しません。TObjectList はその要素を「所有」しているのに対し、TList は所有していないと言えます。これが私の質問の本質です。独自のクラスを設計する場合、この種の所有権の問題を言語内で直接表現する方法はありますか? または、開発者の間で一般的なベスト プラクティスや命名規則はありますか?