shared_ptr の使用例? 質問する

shared_ptr の使用例? 質問する

こんにちは、今日は質問しました同じベクトル配列に異なるタイプのオブジェクトを挿入する方法そしてその質問の私のコードは

 gate* G[1000];
G[0] = new ANDgate() ;
G[1] = new ORgate;
//gate is a class inherited by ANDgate and ORgate classes
class gate
{
 .....
 ......
 virtual void Run()
   {   //A virtual function
   }
};
class ANDgate :public gate 
  {.....
   .......
   void Run()
   {
    //AND version of Run
   }  

};
 class ORgate :public gate 
  {.....
   .......
   void Run()
   {
    //OR version of Run
   }  

};      
//Running the simulator using overloading concept
 for(...;...;..)
 {
  G[i]->Run() ;  //will run perfectly the right Run for the right Gate type
 } 

そして私はベクトルを使いたかったので、誰かがこうすべきだと書いていました:

std::vector<gate*> G;
G.push_back(new ANDgate); 
G.push_back(new ORgate);
for(unsigned i=0;i<G.size();++i)
{
  G[i]->Run();
}

しかし、彼や他の多くの人は、私がポインタコンテナのブースト
またはshared_ptr。このトピックについて 3 時間ほど読んできましたが、ドキュメントは私にとってはかなり高度なもののように思えます。 ****shared_ptr使用方法の小さなコード例と の使用を勧める理由を教えていただけますか。 、などshared_ptrの他の型もありますか** **ptr_vectorptr_listptr_deque

編集1: 次のようなコード例も読みました:

typedef boost::shared_ptr<Foo> FooPtr;
.......
int main()
{
  std::vector<FooPtr>         foo_vector;
........
FooPtr foo_ptr( new Foo( 2 ) );
  foo_vector.push_back( foo_ptr );
...........
}

そして構文がわかりません!

ベストアンサー1

vectorを使用すると、shared_ptrベクトルを調べてdelete各要素を呼び出すことを忘れたためにメモリがリークする可能性がなくなります。例を少し変更したバージョンを 1 行ずつ見ていきましょう。

typedef boost::shared_ptr<gate> gate_ptr;

共有ポインタ型のエイリアスを作成します。これにより、C++言語でstd::vector<boost::shared_ptr<gate> >閉じポインタ間のスペースを忘れて入力することによる醜い状態を回避できます。大なり記号

    std::vector<gate_ptr> vec;

オブジェクトの空のベクトルを作成しますboost::shared_ptr<gate>

    gate_ptr ptr(new ANDgate);

新しいANDgateインスタンスを割り当てて、それをに格納しますshared_ptr。これを別々に行う理由は、操作がスローされた場合に発生する可能性のある問題を防ぐためです。これはこの例では不可能です。shared_ptr「ベストプラクティス」の強化なぜそれがベストプラクティス一時的なオブジェクトではなく、独立したオブジェクトに割り当てます。

    vec.push_back(ptr);

これにより、ベクター内に新しい共有ポインターが作成され、ptrそこにコピーされます。 の内部の参照カウントにより、shared_ptr内に割り当てられたオブジェクトがptrベクターに安全に転送されることが保証されます。

説明されていないのは、のデストラクタがshared_ptr<gate>割り当てられたメモリを確実に削除することです。これがメモリリークを回避する方法です。のデストラクタは、ベクターに格納されているすべての要素に対してのstd::vector<T>デストラクタTが呼び出されることを確実にします。ただし、ポインタのデストラクタ (例: gate*)割り当てたメモリは削除されませんshared_ptrまたは を使用することでこれを回避しようとしていますptr_vector

おすすめ記事