C++ はメモリの所有権、つまり所有権のセマンティクスがすべてです。
そのメモリを解放するのは、動的に割り当てられたメモリのチャンクの所有者の責任です。したがって、問題は本当に誰がメモリを所有するかになります。
C++ では、所有権は生のポインターが内部でラップされる型によって文書化されているため、優れた (IMO) C++ プログラムでは、生のポインターが渡されるのを見ることは非常にまれです (まれではありません)。誰がメモリを所有しているのかわからないため、ドキュメントを注意深く読まなければ、誰が所有権を持っているのかわかりません)。
逆に、生のポインターがクラスに格納されることはほとんどありません。各生のポインターは、独自のスマート ポインター ラッパー内に格納されます。(注:オブジェクトを所有していない場合は、オブジェクトを保存するべきではありません。オブジェクトがいつスコープから外れて破棄されるかがわからないためです。)
だから質問:
- 人々が遭遇した所有権のセマンティックのタイプは何ですか?
- これらのセマンティクスを実装するために使用される標準クラスは何ですか?
- どのような状況でそれらが役立つと思いますか?
回答ごとに 1 種類のセマンティック オーナーシップを保持して、個別に投票できるようにします。
概要:
概念的には、スマート ポインターは単純であり、単純な実装は簡単です。私は多くの試みられた実装を見てきましたが、それらは常に何らかの方法で壊れており、カジュアルな使用や例では明らかではありません. したがって、独自のスマート ポインターを展開するのではなく、ライブラリから十分にテストされたスマート ポインターを常に使用することをお勧めします。std::auto_ptr
または、Boost スマート ポインターの 1 つが私のニーズをすべてカバーしているようです。
std::auto_ptr<T>
:
1 人の人物がオブジェクトを所有しています。所有権の譲渡は許可されています。
使用法: これにより、所有権の明示的な譲渡を示すインターフェイスを定義できます。
boost::scoped_ptr<T>
1 人の人物がオブジェクトを所有しています。所有権の譲渡は許可されていません。
使用法: 明示的な所有権を示すために使用されます。オブジェクトは、デストラクタによって、または明示的にリセットされたときに破棄されます。
boost::shared_ptr<T>
( std::tr1::shared_ptr<T>
)
複数所有。これは単純な参照カウント ポインターです。参照カウントがゼロになると、オブジェクトは破棄されます。
使用法: オブジェクトが、コンパイル時に決定できない有効期間を持つ複数の権限を持つことができる場合。
boost::weak_ptr<T>
:
shared_ptr<T>
ポインターのサイクルが発生する可能性がある状況で使用されます。
使用法: サイクルのみが共有参照カウントを維持している場合に、サイクルがオブジェクトを保持するのを停止するために使用されます。