[解決済み] 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時間を過ごしましたが、ドキュメントは私にはかなり高度に見えます。****Can anyone give me a small code example of
shared_ptr
の使用法と、なぜ
shared_ptr
. また
ptr_vector
,
ptr_list
と
ptr_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 );
...........
}
とか、構文がよくわからない!
どのように解決するのですか?
を使用して
vector
の
shared_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
.
関連
-
[解決済み】C++でint型に無限大を設定する
-
[解決済み】Visual Studio 2015で「非標準の構文。'&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】クラステンプレートの引数リストがない
-
[解決済み] error: 'ostream' does not name a type.
-
[解決済み】「Expected '(' for function-style cast or type construction」エラーの意味とは?
-
[解決済み】'std::cout'への未定義の参照
-
[解決済み] スマートポインターとは何ですか?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] 仮想デストラクタはいつ使うのか?
-
[解決済み】shared_ptrは参照で渡すべきか、値で渡すべきか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] テスト
-
[解決済み】構造体のベクター初期化について
-
[解決済み】coutはstdのメンバではない
-
[解決済み】C++ 非推奨の文字列定数から「char*」への変換について
-
[解決済み】C++ - 解放されるポインタが割り当てられていないエラー
-
[解決済み】IntelliSense:オブジェクトに、メンバー関数と互換性のない型修飾子がある
-
[解決済み】cc1plus:エラー:g++で認識されないコマンドラインオプション"-std=c++11"
-
[解決済み】「Expected '(' for function-style cast or type construction」エラーの意味とは?
-
[解決済み] 配列のベクトルを扱う正しい方法
-
[解決済み】スマートポインタ(boost)の説明