[C ++ 11] C ++ 11のスマートポインタのweak_ptrの新機能

述べたように、我々は今日の話を最後導入C ++ 11で3つのスマートポインタです:weak_ptrを。weak_ptrを最高の学習前のshared_ptrを理解しています。あなたはshared_ptrのが何であるかわからない場合、私は別の記事[C ++ 11] C ++ 11のスマートポインタのshared_ptrの新機能を見ることができます。

1.なぜあなたはweak_ptrを必要ですか?
正式な導入weak_ptrをする前に、我々は最初のshared_ptrのいくつかの知識を思い出します。私たちは、shared_ptrのは、スマートポインタの参照カウントで知って、shared_ptrのインスタンスの数が同じ動的オブジェクトをポイントして、共有参照カウンタを維持することができます。達成するためにカウントするための参照カウントは、常に循環参照(または環状参照)問題、shared_ptrの無い例外を回避することはできません。

のは、次の例を見てみましょう:

#include <iostreamの>
する#include <メモリ>
の#include <ベクトル>
名前空間STDを使用して、

クラスのClassB;

クラスにClassA
{
パブリック:
にClassA(){coutの<< "にClassAコンストラクタ..." <<てendl; }
〜A級(){COUT << "A級デストラクタ..." << ENDL。}
のshared_ptr <ClassBの> PB。//在A中引用B
}。

クラスのClassB
{
パブリック:
ClassBの(){coutの<< "ClassBのコンストラクタ..." <<てendl; }
〜ClassBの(){COUT << "ClassBのデストラクタ..." << ENDL。}
のshared_ptr <A級> PA。//在B中引用A
}。

メインINT(){
= make_shared <A級の> shared_ptrの<A級の>スパ();
shared_ptrの<ClassBの> SPB make_shared = <ClassBの>();
スパ- >鉛= SPB;
spb-> PA =スパ;
エンド//関数、考えてみましょう:スパ、SPBは、リソースにそれを解放するのだろうか?
}
。1
2
3
4
5
6
7
8
9
10
11
12である
13である
14
15
16
17
18である
19。
20
21である
22である
23である
24
25
26である
27
28
29
30
31であり、
次のように上記のコードの出力です。

コンストラクタ... ClassAクラス
ClassBのコンストラクタ...
プログラム終了コードで終了:0
。1
2
。3
主な機能動作の終了後:上記のコードから、A級およびClassBの循環参照の間に存在し、我々は、操作の結果から見ることができますスパ、SPB動的リソース管理は、メモリリークが生じる、リリースされていません。

このような問題を解決するために、C ++ 11導入のweak_ptrは、この循環参照を破壊します。

そのweak_ptrを2.何?
導入のshared_ptrスマートポインタでのweak_ptr、それはweak_ptrをAのshared_ptrのshared_ptrの参照カウントは変更されませんにバインドされている指示対象のライフサイクルに影響を与えずにオブジェクトによって管理のshared_ptrを指します。最後のshared_ptr指しているオブジェクトが破棄された後のweak_ptrポイントかどうかにかかわらず、オブジェクトが解放されます。この観点から、weak_ptrをもっとアシスタントのようではなく、スマートポインタをshared_ptrの。

3、使用方法のweak_ptr?
次は、weak_ptrをの簡単な使い方を見てみましょう。

3.1はどのようにのweak_ptrインスタンスを作成するには
、我々はのweak_ptrを作成するとき、weak_ptrをしませ影響を与えるのshared_ptrの参照カウントを作成し、弱い共有に、shared_ptrのインスタンスのweak_ptrを初期化する必要があり、。

例:

メインINT(){
shared_ptrの<整数> SP(新しい新しいINT(5));
COUT << "参照カウント前に作成SP:" << sp.use_count()<< ENDL ; //はuse_count = 1

weak_ptrを<整数> WP(SP);
COUT << "参照カウントSPを作成した後、" << sp.use_count()<< ENDL; // =はuse_count 1
}
1
2
3。
4。
5。
6。
7。
3.2ポイントのweak_ptrを決定する方法オブジェクトが存在するかどうか
、それがインスタンスカウントへのweak_ptr shared_ptrの参照の共有を変更しないので、そのオブジェクトが解放されるポインティングweak_ptrをそのような場合があります。現時点では、オブジェクトに直接アクセスするのweak_ptr使用することはできません。だから、どのように我々は、オブジェクトがそれにweak_ptrをポイントに存在するかどうかを判断するのですか?C ++は、この機能を実現するためにロック機能を提供します。オブジェクトが存在する場合、ロック()関数は、それ以外の場合は空のshared_ptrを返し、共有オブジェクトのshared_ptrへのポインタを返します。

例:

クラスA
{
パブリック:
():(3){COUT << "コンストラクタ..." << ENDL。}
〜A(){COUT << "デストラクタ..." << ENDL。}

int型;
}。

メインINT(){
のshared_ptrの<A>属(新しいA())。
weak_ptrを<A> WP(SP)。
//sp.reset()。

IF(shared_ptrの<A> wp.​​lock PA =())
{
COUT << PA-> A << ENDL;
}

{
COUT << "WP指し示すオブジェクトが空である" << ENDL;
}
}
1
2
3。
4。
5。
6
7
8
9
10
11
12である
13である
14
15
16
17
18れている
。19
20は、
21である
22である
23である
任意の異なる結果を削除sp.resetた行を参照すること)(コメントしようとします。

また、weak_ptrをも提供して参照されるオブジェクトが破棄されたかどうかを判断する()関数を期限切れ。

例:

クラスA
{
パブリック:
():(3){COUT << "コンストラクタ..." << ENDL。}
〜A(){COUT << "デストラクタ..." << ENDL。}

int型;
}。

メインINT(){
のshared_ptrの<A>属(新しい新しいA());
weak_ptrを<A> WP(SP);
sp.reset(); //この場合、SPは破壊
COUT << wp.​​expired()<< ENDL ; //真のそれ以外の場合はfalseに、破壊されている表す
}
。1
2
3
4
5
6
7
8
9
10
11
12は、
13である
14
15
16
次のようにコードが入力されます。

コンストラクタ...
A ...デストラクタ。
。1
1
2
3
3.3方法のweak_ptr
ロック機能の典型的な使用であるweak_ptrを過負荷にならないoperator->演算子*オペレータ、したがってオブジェクトを直接使用してweak_ptrをしないが、取得するために呼び出されますshared_ptrの例では、元のオブジェクトへのさらなるアクセス。

最後に、我々は、循環参照の問題を破る、コードの前を変換するのweak_ptrを使用する方法を見て。

クラスのClassB;

クラスにClassA
{
パブリック:
にClassA(){coutの<< "にClassAコンストラクタ..." <<てendl; }
〜A級(){COUT << "A級デストラクタ..." << ENDL。}
weak_ptrを<ClassBの> PB。//在A中引用B
}。

クラスのClassB
{
パブリック:
ClassBの(){coutの<< "ClassBのコンストラクタ..." <<てendl; }
〜ClassBの(){COUT << "ClassBのデストラクタ..." << ENDL。}
weak_ptrを<A級> PA。//在B中引用A
}。

メインINT(){
= make_shared <A級の> shared_ptrの<A級の>スパ();
shared_ptrの<ClassBの> SPB make_shared = <ClassBの>();
スパ- >鉛= SPB;
spb-> PA =スパ;
エンド//関数、考えてみましょう:スパ、SPBは、リソースにそれを解放するのだろうか?
}
。1
2
3
4
5
6
7
8
9
10
11
12である
13である
14
15
16
17
18である
19。
20
21である
22である
23である
24の
25
次のように出力結果です。

コンストラクタ...にClassA
ClassBのコンストラクタ...
にClassAデストラクタ...
ClassBのデストラクタは...
0:プログラムは終了コードで終了しました
1
2
3
4
5
スパ、SPBは、オブジェクトが解放された指摘実行した結果からは見ることができます!
----------------
免責事項:この記事はフレッド^ _ ^「元の記事、BY-SAの著作権契約CC 4.0に従って、再現CSDNブロガー」で、元のソースのリンクを添付してくださいそしてこの文。
オリジナルリンクします。https://blog.csdn.net/Xiejingfa/article/details/50772571

おすすめ

転載: www.cnblogs.com/yiyi20120822/p/11612764.html