https://www.e-learn.cn/content/qita/725263
1.はじめに
shared_ptrの(共有メモリ・ポインタ)、shared_ptrの共有メモリへのポインタであり、同一の物体に対する複数のポインタが場合、最後の局所使用、同時に複数のshared_ptrが同じオブジェクトを「所有」または「共有」することができることを意味し、リソースを共有することができます後に自動的に対応するメモリとリソースを解放します。<メモリ>ヘッダ・ファイルに定義されているのshared_ptrと他のスマートポインタは同じです。
2.定義
最後に、使用後に自動的にメモリやリソースをクリーンアップする時期//ここでのpStrは、スタックオブジェクトであります
shard_ptr <はstd ::文字列>のpStr(新しい文字列(「Hello World」の);
3.オーバーロードされた演算子
すべてのスマートポインタとオーバーロードされた演算子 『「」 - 「」>』演算子と 『*』、演算子はshared_ptrの中で呼び出された方法であり、そして - >は、オブジェクトの呼び出しへのポインタでありますアプローチは、「*」、それを逆参照ポインタです。
例:
書式#include <iostreamの> の#include <メモリ> 書式#include <文字列> の#include <iostreamの> 名前空間stdを使用。 INTメイン() { shared_ptrの<ストリング> P1(新しい文字列( "こんにちは")); P1->( "世界")を追加。 文字列* P2 = p1.get(); coutの<< * P2; //输出为のHello World の戻り0; }
前記p1.get();戻りshared_ptrのは、*文字列で管理されています
_Ty *取得()constは_NOEXCEPT {//リソースへのポインタを返す リターン(この- > _取得())を、 }
注意:(* P1)を使用したときに返されるのコンテンツにアクセスすることができることはpStr-を使用して引用>メンバーの一人です。
そして、我々は注意しなければならない「」 - との違い「>」
4.初期化のshared_ptr
以下の文言が間違っているので、コンストラクタは、明示的に変更されます。
shared_ptrの<文字列> pNico =新しい文字列( "ニコ"); // ERROR のshared_ptr <ストリング> pNico {新しい文字列( "ニコ")}。// OK
もちろん、標準ライブラリは、アプリケーションは一度だけ新しいアクションのために適用するには、従来のメモリを使用して、make_sharedメモリ・ブロックを使用している場合ので、専用のshared_ptrを生成し、この高速かつ安全な方法を使用するための機能を提供し、アプリケーションメモリ制御。従来のメモリを使用して、新しいアプリケーションは、直ちにプログラムは、この時点で例外をスローした場合、shared_ptrのために裸のポインタを制御しないであろう場合、プログラムは、メモリリークが発生する問題であろう。
一つだけのメモリが割り当てられ、その後、強い参照カウントが合理的に、0ケースオブジェクト制御ブロックに割り当てられたメモリのメモリこと一緒にあれば場合ので、make_sharedもちろんのweak_ptrと併せて使用される場合、その欠点を使用このとき、リソースの割り当てが解除されなければならないと言うが、weak_ptrを弱い参照がある場合は、この時点では、リソースがすぐに解放されません。
例:
shared_ptrの<文字列> P3 =のstd :: make_shared <文字列>( "ABC");
もちろん、shared_ptrのも手を変えたの内容を変更することができますが、新しい指揮することはできません。
例えば:
:: shared_ptrのSTD <文字列>のpStr(新しい新しいString( "こんにちは、世界")); のpStr =新しい新しい文字列( "ふふふ"); //エラー //正しい言葉遣いをする必要があります: pStr.reSet(新しい新しいString( "lalalal" )); // OK
5.はuse_count
shared_ptrのは、その後0を返す、の数は、オブジェクトがないことを証明する場合、番号(基準のshared_ptrを使用することができるように強い参照が理解される)機能は、オブジェクトの使用に強い参照を返す呼び出しはuse_count()メンバ関数を呼び出しました長く、使用することは、メモリとリソースを解放します。
もちろん、ゼロにはuse_countに加えて外にあなたがnullptrをshared_ptrのために割り当てられたメモリを解放することができ、別の方法があります。
6.カスタムユニットを取り外し
shard_ptrは、デフォルトを提供します場合は、削除が、いくつかのケースでは、彼らは自分自身を定義する必要がありますされが削除され、その後、我々は2番目のパラメータのshared_ptrのコンストラクタを使用します。
例:
shared_ptrの<ストリング> pNico(新しい文字列( "ニコ")、 [](文字列*のP) { COUT << "削除" << * P << ENDL; Pを削除; });
デフォルトの削除はポインタのみを削除することはできますが、アレイを削除することはできません。
std :: shared_ptrの<整数> P(新しいint型[10]); //そう書かれていますが、コンパイラはできません
それはあなたが新しいの配列をしたい場合、あなたはあなた自身のデリータを定義する必要があり、です。
例えば:
std :: shared_ptrの<整数>:PNPTrの(新しいINT [10]、[](int型*のP){削除[] P;});
また、[]削除提供unique_ptrを助けることができるカスタムツールを削除するには削除、
例えば:
shared_ptrの:: STD <整数> pNico(新しい新しいint型[10]、 STD :: default_delete <整数[]>()); のshared_ptr <int型[]> P(新しい新しいint型[10]); //このステートメントは与えられます。 std :: unique_ptrを<整数[]> P(新しいint型[10]); // OK
unique_ptrを文が削除された場合は、それが二番目のパラメータ(関数ポインタ)を与えなければなりません。
例えば:
std :: unique_ptrを<整数、ボイド(*)(INT *)> P(INT [10]新しい、[](INT *のP){削除[] P}。
もちろん、あなたも削除する他の方法を定義することができます
例://一時ファイルを削除します
書式#include <文字列> の#include <fstreamの> //ためofstreamの 書式#include <メモリ> //のためのshared_ptr の#include <cstdioを> //削除のために() クラスFileDeleter { プライベート: STD ::文字列のファイル名。 公共: FileDeleter(CONSTのstd ::文字列&FN): ファイル名(FN){ } ボイド演算子()(STD :: ofstreamの* FP) { FP->近いです(); // close.file のstd ::削除(filename.c_str()); //ファイルを削除 } }; int型のmain() { //作成し、一時ファイルを開く: のstd :: shared_ptrの<のstd :: ofstreamの> FP(新しいはstd :: ofstreamの( "tmpfile.txt")、 FileDeleter( "tmpfile.txt")); ...
カスタムモードを削除する場合は、最初のクラス()で動作しなければならず、この関数の引数は、新しいパラメータと一致していなければならないが、この方法は、複数のパラメータが可能で、コンストラクタ、より多くのことができ、かつ機能が必要と削除しますこのパラメータは、ファイル名であるので、我々はあなたがファイルストリームを閉じることができ、対応するファイルが削除されるように、ファイル名を渡すコンストラクタを必要としています。