ブースの共有ptr Vs弱ptr?る場合に使用する?
-
19-09-2019 - |
質問
現在のプロジェクトを使用してい boost::shared_ptr
非常に重要となる。
最近の私の研究員のチームメイトも使い始めました weak_ptr
.たものかわからない、という一つの利用です。
これとは別に、どうすればよいですかいして変換したい weak_ptr
へ shared_ptr
.なくロック weak_ptr
作 shared_ptr
にコードその他のスレッドかどうか
解決
一般概要
強いポインタ 保証独自の有効性.使用して、例えば、以下のような場合
- 自分たちだけのオブジェクト指摘;を作成しますので、破壊したりしようとするものから
- ませんで定義した場合の動作は、オブジェクトは存在しない
- 必要なものを実施する、オブジェクトが存在します。
弱いポインタ 保証 知ること 独自の有効性.使用して、例えば、以下のような場合
- アクセスすものではない。
- すで定義した場合の動作は、オブジェクトは存在しない
Lock()内の弱いポインタを返します強いポインター;ここからはアクセスに弱いポインタです。場合、オブジェクトがもはや通用しないで削除されたなど)、そのポインタはNULL、そうでない場合はインバーのオブジェクトです。確認処理を行う必要があります。
はじめると、とてもおもしろいでこういうことはできませんので誤って削除し、オブジェクトりますので、無理に押し込まないですがよろした時(現地)に強いポインタで、このようにgarunteedのオブジェクトの存在が強いポインタが残っています。いすを使ってのオブジェクトは、一般には強いポインター秋の範囲(または再配置によりも、それを可能にするオブジェクトが削除されます。のためのmultithreading、同ケアで扱えない内蔵のスレッドの安全性を指摘し、保証、最初に述べた ま 開催時multithreading.AFAIKない特別な過去のこと。
の向上の共通のポインタも、ガベージコレクターのように、時以降は最後の力強いポインタをオブジェクトが離れた点はどこか他の、あなたのオブジェクトが削除されます。
もあり、円形の依存関係の記の応答となります。
根本的に、というかげ共有のポインター図書館できませんべての空港を表示一部の空港を表けのプログラムではなく、時間を適切にデザインへのポインタがオブジェクト所有権および寿命.まいになデザイン、利用できるって保管しなければならない。場合にそのようなデザインなら、まる可能性が高に異なる問題です。
他のヒント
あなたが作成したオブジェクトが戻って自分自身にweak_ptr
を持つオブジェクトに、すなわちshared_ptr
循環参照が含まれている使用shared_ptr
。 shared_ptr
が循環参照を扱うことができないためです - 両方のオブジェクトがスコープ外に行くときに、相互参照は、それらが「ゴミが収集」されていないことを意味し、その記憶が失われ、あなたがメモリリークを持っています。 weak_ptr
は、参照カウントを増加させないので、周期的な参照の問題は発生しません。また、これはあなただけの参照がカウントされ、weak_ptr
を使用し、その後、その参照カウントを増やしたくない何かへのポインタをしたい場合ことを一般的に意味します。
そうでなければ、あなたはshared_ptr
を使用することができます。
詳細については、ブーストをチェックドキュメント。
共通のポインタの実施のリファレンスカウンターでは、弱いポインタに影響を与えないリファレンスカウンターとのない共通のポインタをオブジェクトが弱いのにポインタをオブジェクトが削除され、弱いポインタの現在にお伝えすることは、オブジェクトは失われました。
おいては、二つの理由が考えら利用の弱いポインター:
- 排除のコストの参照カウントを増加/減少;しかしくないのでエラーが発生しやすいとんとか時間
- 商簿記のデータ構造などいの指標すべてのオブジェクトFoo"と"元気"の編集にあたっては、使いか、いくFooの指標すべてを"リアル"の使用は終了いたしました。この基本的な利用の場合弱のポインタ.もちろんその他に存在します。
従って、一般的に、私の勧告に使うの弱さのポインタがることをご存知だろう参照されるオブジェを除を知りたいとします。その他の場合は共通のものを使用ポイント(リファレンスカウンター)、直接へのポインタがあります。方法ローカル変数が分かっている場合は、その物にならない取得して削除されます。もerrorproneものの、より共有のポインタ.
N.B.循環的な物が不要の弱さへのポインタが利用できる非、通常のポインタの代わりに最適なものを構築。弱いポインタの下に危なものです。
あなたはおそらく、あなたはそれが密接に十分に間違って行くことができるすべてを追跡するにはあまりにも難しいので、C ++でホットなアイデアではありませんガベージコレクタを実装しようとしている場合を除き、すべての弱いポインタを使用しようとするべきではありません。