スマートポインタを高めます

1.ブースト:: scoped_ptrを、動的に割り当てられたオブジェクトの唯一の所有者で、コピーまたは移動することはできませんスマートポインタです。

#includeは</ scoped_ptr.hppブースト> 
の#include <入出力ストリームを> INT (){主
  scoped_ptrを::ブースト < INT(> P 新しい新しいINTを1 )); 
  STD :: COUT << << P * STD :: ENDL。 p個のポインタアドレス
  p.reset(新新int型2 )); RESET()オブジェクトのリリース前に、再設定し、新しいオブジェクト
  のstd :: coutの << * P。GET()<< はstd ::てendl; GET()を取得します。ポインタアドレス
  p.reset(); 
  STD :: COUT << << <:: boolalpha STDををstatic_cast BOOL >(P)<< STD :: ENDL; Pの戻りブール値、この場合はfalseに
   戻り0 
}

   

型ブースト:: scoped_ptrをスマートポインタは、オブジェクトの所有権を譲渡することはできません。一度アドレスを初期化し、動的に割り当てられたオブジェクトが解放されたときに

デストラクタが実行されるか、メンバ関数リセット()が呼び出されたとき。

 

2.ブースト:: scoped_arrayは、ブースト:: scoped_ptrを同じように使用されます。決定的な違いは、ブースト:: scoped_arrayのデストラクタは、オペレータが含まれているオブジェクトを解放するために[]削除使用していることです。この演算子は、配列のみに適用されるので、ブースト:: scoped_arrayは、動的に割り当てられた配列のアドレスで初期化する必要があります。

#include <ブースト/ scoped_array.hpp> int型のmain(){ 
  ブースト:: scoped_arrayを < INT > P(新しいINT [ 2 ])。
  * P。取得 =)(1 ; 
  P [ 1 ] = 2 ; 
  p.reset(新しいINT [ 3 ])。
  リターン0 ; 
}

   

 

3.スマートポインタブースト:: shared_ptrのは後押しする:: scoped_ptrをを同様です。主な違いは、ブースト:: shared_ptrのは、必ずしもオブジェクトの排他的な所有者ではないということです。Onwership型ブーストの他のスマートポインタ:: shared_ptrのと共有することができます。オブジェクトを参照する共有ポインタの最後のコピーが破壊されるまで、このような場合には、共有オブジェクトが解放されていません。スマートポインタをコピーすることができます。

#include <ブースト/ shared_ptr.hpp> 
の#include <iostreamの> int型のmain(){ 
  ブースト:: shared_ptrの < 整数 > P1(新しいINT1 ))。
  std :: coutの << * P1 << はstd ::てendl; 
  後押し:: shared_ptrの < 整数 > P2(P1); 
  p1.reset(新しいint型2 ))。
  std :: coutの << * P1。取得()は、<< はstd ::てendl; 
  p1.reset(); 
  std :: coutの <<はstd :: boolalpha <<はstatic_cast < BOOL >(P2)<< はstd :: ENDL。
  

   ; 
}

出力は次のようになります。

1

2

リセット()P1に呼び出されると、新しいintオブジェクトは、P1に固定されています。これは、既存のint型のオブジェクトが破棄されることを意味するものではありません。それはまた、P2に固定されているので、それが存在し続けています。後押し:: shared_ptrのは、内部参照カウンタを使用しています。ブースト:: shared_ptrのは、スマートポインタの最後のコピーが破壊されたことを検出した場合にのみ削除でリリースに含まれるオブジェクトです。

 

4.ブースト::のshared_arrayの呼び出しが削除[]デストラクタで、このスマートポインタは配列のために使用することができます。

#include <ブースト/ shared_array.hpp> 
の#include <iostreamの> int型のmain(){ 
  ブースト::のshared_array < 整数 > P1(新しいINT [ 1 ])。
  { 
    ブースト::のshared_array < 整数 > P2(P1)。
    P2 [ 0 ] = 1 ; 
  } 
  のstd :: COUT << P1 [ 0 ] << はstd :: ENDL。
  リターン0 ; 
}

  

動的に割り当てられたint配列のスマートポインタP1とP2株式所有。P2の配列は、数1を格納するためにオペレータ[]でアクセスされたときに、同じアレイがP1でアクセスされます。したがって、例では、標準出力に1を書き込みます。

 

ブースト:: shared_ptrのと併せて使用する場合にのみ意味をなすのweak_ptr 5.ブースト::。

#include <ブースト/ shared_ptr.hpp> 
の#include <ブースト/ weak_ptr.hpp> 
の#include <スレッド> 
の#include <機能> 
#inclue <入出力ストリーム> ボイドリセット(ブースト:: shared_ptrの< 整数 >&SH){ 
  sh.reset (); 
} ボイドプリント(ブースト:: weak_ptrを< INT >&W){ 
  :: shared_ptrの向上 < INT > SH = wです。ロック();
  もし(SH){ 
    のstd :: COUT << * SH << はstd :: ENDL。
  } 
} int型のmain(){ 
  ブースト:: shared_ptrの <





> SH(新しい int型99 )); 
  後押し:: weak_ptrを < 整数 > ワット(SH)。
  STD ::スレッドT1(リセット、STD:REF (SH))。
  STD ::スレッドT2(プリント、STD :: REF (W))。
  t1.join(); 
  t2.join(); 
  リターン 0 ; 
}

後押し:: weak_ptrをブースト:: shared_ptrのを初期化する必要があります。その最も重要なメンバ関数は)(ロックです。ロック()ブーストを返す::弱いポインタを初期化するために使用される共有ポインタと所有権を共有するshared_ptr。共有ポインタが空である場合には、返されたポインタは、同様に空になります。

 

おすすめ

転載: www.cnblogs.com/sssblog/p/10945129.html