C ++はすべてメモリの所有権、つまり所有権のセマンティクスです。
動的に割り当てられたメモリのチャンクの所有者は、そのメモリを解放する必要があります。したがって、問題は実際には誰がメモリを所有するかになります。
C ++での所有権は、生のポインターが内部にラップされるタイプによって文書化されているため、優れた(IMO)C ++プログラムでは、生のポインターが渡されるのを確認することは非常にまれです(まれではありません)(生のポインターには推論された所有権がないため、誰がメモリの所有者であるかを知らないため、ドキュメントを注意深く読まなければ、誰が所有者であるかはわかりません)
逆に、クラスに生のポインタが格納されていることはまれです。各生のポインタは、独自のスマートポインタラッパー内に格納されます。(注:オブジェクトを所有していない場合は、オブジェクトがスコープ外になり、破棄されるタイミングがわからないため、オブジェクトを格納しないでください。)
だから質問:
- 人々が遭遇した所有権のセマンティクスのタイプは何ですか?
- これらのセマンティクスを実装するために使用される標準クラスは何ですか?
- どのような場合に役立ちますか?
回答ごとに1種類のセマンティック所有権を保持し、個別に投票できるようにします。
概要:
概念的には、スマートポインターは単純で、単純な実装は簡単です。私は多くの試みられた実装を見てきましたが、それらは常に何らかの方法で壊れており、何気ない使用や例には明らかではありません。したがって、自分でロールするのではなく、ライブラリから十分にテストされたスマートポインタを常に使用することをお勧めします。std::auto_ptr
または、Boostスマートポインターの1つが私のニーズをすべてカバーしているようです。
std::auto_ptr<T>
:
一人がオブジェクトを所有しています。所有権の譲渡が許可されています。
使用法:これにより、所有権の明示的な移転を示すインターフェースを定義できます。
boost::scoped_ptr<T>
一人がオブジェクトを所有しています。所有権の譲渡は許可されていません。
使用法:明示的な所有権を示すために使用されます。オブジェクトは、デストラクタによって、または明示的にリセットされたときに破棄されます。
boost::shared_ptr<T>
(std::tr1::shared_ptr<T>
)
複数の所有権。これは単純な参照カウントポインターです。参照カウントがゼロに達すると、オブジェクトは破棄されます。
使用法:オブジェクトが、コンパイル時に決定できない存続期間を持つ複数の所有者を持つことができる場合。
boost::weak_ptr<T>
:
shared_ptr<T>
ポインタのサイクルが発生する可能性がある状況で使用されます。
使用法:サイクルのみが共有参照カウントを維持しているときに、サイクルがオブジェクトを保持しないようにするために使用されます。
In C++ ownership is documented by the type a RAW pointer is wrapped inside thus in a good (IMO)
これは言い換えることができますか?全然わからない。
In C++ ownership is documented by the type a RAW pointer is wrapped inside thus in a good C++ program it is very rare to see RAW pointers passed around
。RAWポインターには所有権のセマンティクスがありません。所有者がわからない場合は、オブジェクトを削除した責任者がわかりません。所有権を定義するポインタ(std :: shared_ptr、std :: unique_ptrなど)をラップするために使用されるいくつかの標準クラスがあります。ポインターの削除を担当するユーザーを定義します。