0

スマート ポインターについていくつか質問がありますが、以前は信用していませんでした。

  1. オブジェクトを所有する、オブジェクトを指す、スマート ポインターの世界でオブジェクトを管理する、とはどういう意味ですか? 以前は、オブジェクトを所有する人もそれを指し示し、オブジェクトを管理していると考えていました。これで、スマート ポインターはオブジェクトを所有できるが、別のオブジェクト (エイリアス コンストラクター) を指すことができることがわかりました。ここで、オブジェクトを所有することの意味について本当に良い説明を見つけました-> http://www.umich.edu/~eecs381/handouts/C++11_smart_ptrs.pdf、それでも私はこの3つの用語を区別できません。
  2. ポインターがオブジェクトを所有しているが、別のオブジェクトを指している場合、彼はどのオブジェクトを管理していますか? 彼がそれを所有しているもの、または彼が指し示しているもの、あるいはその両方? オブジェクトを所有しているのに、それを指していないことに何の意味があるのでしょうか?
  3. 2 つのスマート ポインターが等しいのはいつですか? 2 つのポインターが同じオブジェクトを所有していて、同時に異なる可能性がありますか? 私はそれらの価値の平等には興味がありませんが、所有権に関してです。
  4. 所有権の順序が重要なのはなぜですか (ポインターをコンテナー内のキーとして使用する以外に)? これは shared_ptr にのみ関連すると思います。

すべては owner_before を理解しようとすることから始まりましたが、今ではこのトピックを調べ始める前よりも混乱しています.. :(

4

3 に答える 3

0

古い「生の」ポインター:

someType* pR = new someType(param1, param2); //pR is a pointer
MyOwner.TakeOwnershipOf(pR); // Now MyOwner is the owner, **the one who ONLY should call 'delete pR;'**

スマートポインター:

std::shared_ptr<someType> sp = std::make_shared<someType>(param1, param2);

"sp"が所有者になりました(コードには "pR" はありませんが、内部的にはあります)。また、「delete pR」を呼び出す必要はありません。pR へのポインタを内部に格納し、不要になったら削除するオブジェクトです。

sp はオブジェクトです。「sp->any」は「pR->any」とまったく同じです。これにより、sp がポインターでもあることに混乱する可能性があります。いいえ、「->」がオーバーロードされていることが起こります。

より過負荷:

sp.get()と同じpRです。*spと同じです*pR

sp1 == sp2pR1 == pR2同じsp1.get()==sp2.get()

たとえば、shared_ptr の利点は、複数のコンテナーに同じポインターを格納する必要がある場合です一部のコンテナーが削除された場合、格納されているポインター (pR を所有する sp) も削除する必要があります。これにより、他のコンテナーに格納されているポインターが無効になります。このポインターの存在について他のコンテナーを検査する代わりに、shared_ptr が担当します。これは、格納されている最後のコンテナーによってのみ削除されるspため、安全に削除できます。pRsp

于 2016-12-14T16:34:30.810 に答える