C ++ shared_ptr

C Shared_ptr



NS shared_ptr は、ポインタによって作成されたオブジェクトの共有所有権を含むC ++のスマートポインタの一種です。ポインタを別のオブジェクトに格納するときにオブジェクトの所有権を共有し、共有参照カウンタは所有者の数をカウントします。 NS shared_ptr オブジェクトをコピーした後、参照カウンターを1つ増やし、オブジェクトを破棄した後、参照カウンターを1つ減らします。オブジェクトが所有するメモリは、オブジェクトが最後に所有する場合に再割り当てされます shared_ptr 破壊された、または reset() オブジェクトに別のポインタを割り当てるために関数が呼び出されます。いつ shared_ptr オブジェクトを所有していない場合、それは空の共有ポインタと呼ばれます。のさまざまな用途 shared_ptr このチュートリアルで示されています。

例1:さまざまな方法で共有ポインターを宣言する

次の例では、共有ポインターを宣言する3つの異なる方法を示します。コンストラクターとパブリックメソッドを持つクラスがコードで宣言されています。コンストラクターを使用して新しい共有オブジェクトが作成されると、コンストラクターはメッセージを出力します。 NS 画面() メソッドは、呼び出し元の共有ポインタオブジェクトに基づいてメッセージを出力します。ここでは、コンストラクターを呼び出さずに最初の共有ポインターオブジェクトが作成されています。 2番目の共有ポインターオブジェクトは、コンストラクターを呼び出すことによって作成されています。 3番目の共有ポインターは、最初の共有ポインターを割り当てることによって作成されました。 NS 画面() メソッドは、3つの共有ポインタオブジェクトを使用して3回呼び出されました。







//必要なライブラリを含める

#含む

#含む

usingnamespacestd;

//クラスを定義します
classMyClass{{
公衆
//コンストラクタを宣言します
私のクラス(()。 {{
費用<<'コンストラクターが呼び出されます。NS';
}
//テキストを印刷するメソッドを宣言します
voidDisplay((文字列str)。
{{
費用<<'Display()メソッドはから呼び出されます'<<NS<<'ポインタ。NS';
}
};

intmain(()。
{{
//コンストラクターを呼び出さずにshared_ptrを初期化します
shared_ptr p1=make_shared(()。;
p1->画面(('初め')。;
//コンストラクターを呼び出してshared_ptrを初期化します
shared_ptr p2=shared_ptr((newMyClass)。;
p2->画面(('2番目')。;

//割り当てによってshared_ptrを初期化します
shared_ptr p3=p1;
p3->画面(('三番目')。;
return0;
}

出力:



上記のコードを実行すると、次の出力が表示されます。コンストラクターは、2番目のオブジェクトの作成時にのみ呼び出しました。したがって、コンストラクターのメッセージは1回だけ出力されます。







例2:保存された共有ポインターの場所を印刷する

get()関数の共有ポインタは、格納されている共有ポインタの場所を返すために使用されます。次の例では、クラスと関数によって作成された、保存された共有ポインターの場所を出力します。ここでは、コンストラクターを持つクラスが、共有ポインターの作成に使用されるように定義されています。 get()関数を使用して、共有ポインターを作成し、共有ポインターの場所を出力する関数が宣言されています。このコードでは、最初の共有ポインターはクラスを使用して作成され、2番目の共有ポインターは関数を使用して作成され、3番目の共有ポインターは最初のポインターを割り当てることによって作成されています。

//必要なライブラリを含める

#含む

#含む

usingnamespacestd;

//クラスを定義します
classMyClass
{{
公衆
//コンストラクタを宣言します
私のクラス(()。 {{
費用<<'コンストラクターが呼び出されます。NS';
}
};
//ポインタを初期化する関数を定義します
voidInit_shared_ptr(()。
{{
shared_ptr p2((newMyClass)。;
費用<<p2。得る(()。 <<'NS';
}

intmain(()。
{{
//コンストラクターを呼び出してshared_ptrを初期化します
shared_ptr p1=shared_ptr((newMyClass)。;
費用<<p1。得る(()。 <<'NS';

//関数を呼び出してshared_ptrを初期化します
Init_shared_ptr(()。;

//割り当てによってshared_ptrを初期化します
shared_ptr p3=p1;
費用<<p3。得る(()。 <<'NS';
return0;
}

出力:



上記のコードを実行すると、次のような出力が表示されます。出力では、1番目と3番目の共有ポインターのget()関数の戻り値は同じです。ただし、2番目の共有ポインターは異なります。

例3:共有ポインタオブジェクトを数える

次の例は、ポインターを作成および破棄した後、共有ポインターが指すオブジェクトの数をカウントする方法を示しています。コンストラクターを持つクラスがコードで宣言されています。最初の共有ポインターはクラスを使用して作成され、2番目の共有ポインターは最初の共有ポインターを使用して作成されました。 reset()関数を呼び出す前後の両方の共有ポインターが指すオブジェクトの数は後で出力されています。

//必要なライブラリを含める

#含む

#含む

usingnamespacestd;
//クラスを定義します
classMyClass{{
公衆
//コンストラクタを宣言します
私のクラス(()。 {{
費用<<'コンストラクターが呼び出されます。NS';
}
};
intmain(()。
{{
//コンストラクターを呼び出して最初のshared_ptrを初期化します
shared_ptr p1((newMyClass)。;

//最初のポインタでshared_ptrオブジェクトの数を表示します
費用<<'p1ポインティング'<<p1。use_count(()。 <<'オブジェクト。NS';
//最初のshared_ptrを使用して2番目のshared_ptrを初期化します
shared_ptr p2((p1)。;
// shared_ptrオブジェクトの数を1番目と2番目のポインタで表示します
費用<<'p2ポインティング'<<p2。use_count(()。 <<'オブジェクト。NS';
費用<<'p1ポインティング'<<p1。use_count(()。 <<'オブジェクト。NS';
// shared_ptrオブジェクトから最初のポインタの所有権を削除します
p1。リセット(()。;
// shared_ptrオブジェクトの数を2番目のポインタで表示します
費用<<'p2ポインティング'<<p2。use_count(()。 <<'オブジェクト。NS';
return0;
}

出力:

上記のコードを実行すると、次の出力が表示されます。最初のポインタ、 p1 は、作成後に1つのオブジェクトを指しています。 2番目のポインターを作成した後、 p2 、最初のポインタを使用して、 p1 、両方のポインターは、ポインターを共有するための2つのオブジェクトを指しています。ポインタのreset()関数を呼び出した後、 p1 、1つのオブジェクトが破壊され、ポインタ、 p2 は、1つのオブジェクトのみを指しているようになりました。

結論:

このチュートリアルでは、C ++で共有ポインターを使用する目的について、簡単な例を使用して説明しました。さまざまな方法で共有ポインターを作成し、保存されている共有ポインターの場所を取得し、共有ポインターが指すオブジェクトの数を数えます。このチュートリアルを読んだ後、C ++コーダーがコードで共有ポインターを使用できるようになることを願っています。