こんにちは、今日は質問しました同じベクトル配列に異なるタイプのオブジェクトを挿入する方法そしてその質問の私のコードは
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_vector
ptr_list
ptr_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
。