C++  shared_from_この情報検索

9508 ワード

shared_についてfrom_thisが検索した資料:
1.TcpConnectionはenableを使用しています.shared_from_このベースクラス、このベースクラスはsharedを提供しています.from_this()共通メソッドは、サブクラス内部でshared_を取得できます.ptrのオブジェクトは、クラス実装中に自分のポインタを渡す必要がある場所に使用されます.いくつか注意すべき点があります.
  • enable_shared_from_これはベースクラスですが、shared_にあります.ptrでenableを初期化shared_from_thisのメンバーweak_ptr.したがって、サブクラスの構築方法でshared_を呼び出すことはできません.from_こんな時だからptrは空です.
  • クラスの内部でthisポインタを直接使用しない理由は、プログラムでshared_を使用しているからです.ptrはポインタを管理し、クラスの内部伝達中に元のポインタを使用すると、クラス内部の参照shared_ptrは気づかない.私たちが伝わった時にshared_ptrは
  • を放出した
    2. shared_ptr     enable_shared_from_this
    メモリ漏洩を回避する方法の1つは、always use a named smart pointer variable to hold the result of new
    shared_ptr  p(new T);
    boostドキュメントではまずenableについて説明しています.shared_from_thisの役割:The header defines the class template enable_shared_from_this. It is used as a base class that allows a  shared_ptr  to the current object to be obtained from within a member function.
  • enable_shared_from_thisはDのベースクラスとして、Dはその2つのpublic関数を継承します:
  •     shared_ptr shared_from_this() ;    const shared_ptr  shared_from_this  const ();
  • Dオブジェクト自体はshared_を直接呼び出すことはできません.from_this()の、boostのコード設計では、Dはenable_から継承されます.shared_from_thisのprivateメンバーweak_ptr weak_this_ サードパーティ関数からD_を呼び出すinternal_accept_owner(shared_ptrconst*Dptr,D*pD)は初期化され、このサードパーティ関数はshared_ptr.hppで実装され、shared_ptr<>のコンストラクション関数呼び出し(thisを簡単に渡す)
  •  1 #include <boost/shared_ptr.hpp>
    
     2 #include <boost/enable_shared_from_this.hpp>
    
     3 #include <iostream>
    
     4 
    
     5 using namespace std;
    
     6 using namespace boost;
    
     7 
    
     8 class WY : public enable_shared_from_this<WY>{
    
     9 public:
    
    10     WY (int i):i_(i) { cout << "WY's constructor" << endl; }
    
    11 
    
    12     int i (){return i_;}
    
    13     
    
    14     shared_ptr<WY> get_shared_ptr (){
    
    15         cout << "in get_shared_ptr ==> i = " << i_ << endl;
    
    16         return shared_from_this();
    
    17     }
    
    18 private :
    
    19     int i_;
    
    20 };
    
    21 
    
    22 int main ()
    
    23 {
    
    24     WY wy(6);  //  wy         (   enable_shared_from_this<WY>) weak_ptr<WY>,       ,     wy.shared_from_this()   
    
    25     shared_ptr<WY> ptr(new WY(5));  //  ptr    WY,  weak_ptr<WY>,       
    
    26     shared_ptr<WY> p = ptr->shared_from_this();
    
    27     ptr->get_shared_ptr();
    
    28     wy.get_shared_ptr();
    
    29     p = wy.shared_from_this();
    
    30 }

    24行のwyのweak_ptrは初期化されず、25行のptrは初期化されています
    プログラムが28行になったらin get_をプリントアウトshared_ptr i=6以降異常終了、すなわちwyでshared_を呼び出す限りfrom_このプログラムは異常終了です
    上の第2の点のソースコードの剖析については1-46-1について述べたが、以前のバージョンのソースコードをめくってみると、このように実現されていないことが分かった.internal_accept_ownerという関数なので、覚えておくだけでboostが外に提供する使い方です.それはshared_です.ptrpDの持用D、その中のweak_this_shared_を呼び出すには初期化されています.from_このようにpD->shared_from_this()
    3. shared_from_this()クラスでクラスオブジェクト自体を渡す必要がありますshared_ptrの場所でshared_を使うfrom_この関数は、自身を指すshared_を取得します.ptr、enableです.shared_from_thisのメンバー関数、shared_を返します.ptr.まず注意しなければならないのは、この関数はshared_のみです.ptrのコンストラクション関数が呼び出されてから使用できます.なぜならenable_shared_from_this::weak_ptrはenableにはありませんshared_from_thisコンストラクション関数ではなくshared_ptrのコンストラクション関数で設定します. 
    a)次のコードはエラーです.
    1 class D:public boost::enable_shared_from_this<D>  
    
    2  {  
    
    3  public:  
    
    4      D()  
    
    5   {  
    
    6          boost::shared_ptr<D> p=shared_from_this();  
    
    7     }  
    
    8 };  

    理由は簡単で、Dの構造関数ではenable_が保証されていますがshared_from_thisのコンストラクション関数が呼び出されましたが、前述したようにweak_ptrはまだ設定されていません.b)次のコードもエラーです.
     1 class D:public boost::enable_shared_from_this<D>  
    
     2  {  
    
     3  public:  
    
     4      void func()  
    
     5      {  
    
     6          boost::shared_ptr<D> p=shared_from_this();  
    
     7      }  
    
     8  };  
    
     9  void main()  
    
    10  {  
    
    11      D d;  
    
    12      d.func();  
    
    13  }  

    エラーの原因は同じです.c)次のコードが正しい.
    1 void main()  
    
    2  {  
    
    3      boost::shared_ptr<D> d(new D);  
    
    4      d->func();  
    
    5  }  

    ここでboost::shared_ptrd(new D)は実際に3つの動作を実行する:1.まずenable_を呼び出しますshared_from_thisのコンストラクション関数;2.次にDのコンストラクタを呼び出す.3.最後にshared_を呼び出すptrのコンストラクション関数.3番目のアクションにenableが設定されています.shared_from_こののweak_ptrは、1番目の動作ではありません.ここはc++の常識と論理に反しているので、気をつけなければなりません.結論:構造関数でshared_を使用しないでください.from_this;次にshared_を使用する場合ptrは,すべての場所で使用すべきであり,D dという方式は使用できず,裸のポインタも決して渡さない.