1. ホーム
  2. c++

[解決済み] shared_ptrの使用例?

2023-06-06 23:59:36

質問

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

 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時間を過ごしましたが、ドキュメントは私にはかなり高度に見えます。****Can anyone give me a small code example of shared_ptr の使用法と、なぜ shared_ptr . また ptr_vector , ptr_listptr_deque ** **

Edit1: 私もコード例を読んだことがあります。

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 );
...........
}

とか、構文がよくわからない!

どのように解決するのですか?

を使用して vectorshared_ptr を呼び出すと、ベクターを歩くのを忘れたためにメモリがリークする可能性を排除できます。 delete を呼び出すのを忘れたためにメモリリークが発生する可能性を排除します。 この例を少し修正したものを一行ずつ見ていきましょう。

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 .