スマートポイント:の者の所有す赤ちゃん?[定休日]
-
01-07-2019 - |
質問
C++で記憶保有
通称"所有権を意味論"
この責任の所有者のチャンクを動的に割り当てられたメモリをリリースする。その質問にもなったメモリの内容を消去します。
C++を所有することが文書化されるタイプの原ポインタに包このように良い(IMO)C++プログラムでは珍しい【希少ない]を参照のポインタを渡(原のポインタして推定される所有することができない方は、メモリ、このような注意を読み、書類できない責任者の責任の所有).
逆にいうのは珍しいことだと思う原のポインタを格納クラスの各原ポインタの中に保存された独自のスマートラッパーポインタ.(N.B.: ない場合はオブジェクトすべきではないで格納すのでお知ることのできない場合での範囲および廃棄させていただきます。)
その質問:
- どのような所有権を意味して来るのがソーシャルメディア。
- どの標準クラスを実装するために使われている方は意味論?
- う状況にならないとして有用か?
きい1タイプの意味的所有権お答えすることができ投票で上下に個別に
概要:
概念的にはスマートポインタがシンプル、ナイーブの実装を容易にしています。自然と精神との融合によって実装を試みたものの、人々のものがあるしないことが明らかではないことをカジュアル使用例です。このようにお勧めで常に上手に利用して試験"スマートポインタ"から図書館ではなく転がります。std::auto_ptrのブースマートポインタもカバーすべてのコニーとも狭いです。
std::auto_ptr<T>:
人所有のオブジェクトです。
が所有権移転を許可します。
使用量:
======
することができますを定義するインターフェースを明示的所有権移転外.
ブ::scoped_ptr<T>
人所有のオブジェクトです。
所有権移転はできません。
使用量:
======
使用を明示的に保有しました。
オブジェクトが破棄されるデストラクタが明示的にセットします。
ブ::shared_ptr<T> (std::tr1::shared_ptr<T>)
複数保有しました。
これは単に参考計数ポインタです。場合参照カウントがゼロに達するオブジェクトが破壊されました。
使用量:
======
時オブジェクトが複数の興味とのできないコンパイル時に決まります。
ブ::weak_ptr<T>
使用shared_ptr<T>.
が存在する場合のサイクルポインタの問題が発生します。
使用量:
======
利用停止のサイクルから固定オブジェが、サイクルを維持することが共有refcount.
解決
私にとって、これらの3種類のカバーの私のニーズ:
shared_ptr
-参考-計数し、解放時にカウンタがゼロに達する
weak_ptr
-上記と同じですが、'スレーブのために"と shared_ptr
, できないのを修復させようとするとエラーが
auto_ptr
-のときの作成と解放が起こる中、同じ機能をもつ又はそのオブジェクトが考えられるワンオーナーだけます。るときは、一時的に一つのポインタものを盗むのオブジェクトから初めてとなります。
私は自分の実施のためにこれらのものも使用可能 Boost
.
まだまだパスオブジェクト参照const
可能な限り、この場合、メソッド呼び出し時に実行されるとともに、グループオブジェクトの生みの時にすることができます。
このようなポインタを使うことを呼びかけ hub_ptr.できるオブジェクトからアクセスできなければなら物を入れ子にで(通常チャージすることができる仮想基本クラス).この解決手 weak_ptr
しがない shared_ptr
めます。としても知っておこれらのオブジェクトな長生きようなhub_ptrしていたところでテンプレートするラッパーには通常のポインタ.
他のヒント
簡単なC++モデル
ほとんどのモジュールを見たデフォルトでは、ここでも、受信したポインタ ない を受けます。この機能の方法所有権を放棄のポインタは両方とも非常に珍しいと明示的に表現する事実を書です。
このモデルは、そのユーザーはオーナーのみのかを明示的に割り当て.他のすべてが自動的に処分で対象範囲出口、又は通機は、既販の").これは、Cのようなモデルの延長という一番のポインタの所有するオブジェクトまでを修復させようとするとエラーがて自動的に又は必要なとき(該物体の破壊は、主に、生命のdurationオブジェクトの予測(rau-α(お友達。
このモデルでは、原料のポインタが自由に循環させ、主に危険はない(でもその開発者でも、その使用を参照できます。
- 原料のポインタ
- std::auto_ptr
- ブ::scoped_ptr
スマートとC++モデル
コードのスマートポインタは、ユーザーが希望を無視するの寿命をサポートします。あるオーナーさんのユーザコード:このスマートポインタ(rau-α(ま). 問題は円形の参照を混合しの参考計数のスマートポインタで命, ですから、対応もとでは共通のポインタが弱いポインタ.いものの所有権を考える(弱いポインタがポイントでもない場合でも、その優位性原のポインタでできます。
- ブ::shared_ptr
- ブ::weak_ptr
結論
どのモデルで記述 ない限り、例外を受けるポインタ ない を受け、その所有権 や するはずですが、ヒトにおいても重要な知を有する者.でもC++のコードを多用文献および/またはスマートポインタ.
いて共有します。う場合、必ずこのコードだけます。
この100%の問題で軍おかもとの相互作用.
- 共有
- ブ::shared_ptr
リソースを共有し複数のオブジェクト。の向上shared_ptr用リファレンスカウンターかどうかを確認するためにリソースがドに割り当てがみなfinsihed.
std::tr1::shared_ptr<Blah>
は非常にしばしば最良のベット。
- ワンオーナー
- ブ::scoped_ptr
が必要な場合にメモリを割り当てを動的にもたいと思っていく割毎口のブロックです。
だが、こうした置として容易に行うことができるreseated発な気漏れ
ようになるといいと思いました位置して共有にデザインしました。この上から私の頭のみ有効になっていると考えることができるでフライ級パターンです。
yasper::ptrは軽量の向上::shared_ptrいます。でも私の)のもの小さな仕事である。
のウェブページ http://yasper.sourceforge.net/ では以下のように記述します:
理由書もC++のスマートポインター?が存在する複数の高 品質のスマートポインタの実装 C++、最も顕著に向上 ポインターパンテオンとロキのSmartPtr.もとの比較のスマートポインタ 実装は、ご使用される場合などには、 適切なくお読みいただハーブサタの 最新のC++:スマート(er)のポインタ.に 対照的に、広大な特徴 他の図書館Yasperは 狭心のリファレンスカウンター ポインタです。にも対応し、さまとの緊密な Boostのshared_ptr、"ロキの RefCounted/AllowConversion。YasperできるC++プログラマにとっ 忘れてメモリ管理な 導入の向上の大きな 依存関係を学ぶ "ロキの複雑な政策をテンプレート。哲学
* small (contained in single header) * simple (nothing fancy in the code, easy to understand) * maximum compatibility (drop in replacement for dumb pointers)
最後の点で危険ですので、以来、 yasper許認可リスク(ただし有) 行動などの課題への原 ポケットのマニュアルリリース) 許可によるその他の実装方法です。注意したいのみ使用される場合 何かやっている!
あり、他に使用頻度の高い形のシングル-譲渡-オーナーとすることが望ましい。 auto_ptr
がされることを回避することができる問題 auto_ptr
's"狂気汚職の意味論。
かんな swap
.任意の型に適した swap
の機能を考案してい スマート参照 一部のコンテンツ、その保有するまでの間、所有権移転別のインスタンスは同じタイプによる入れ替えました。各インスタンスを保持し、そのアイデンティティがてられる新しい内容です。このように安全にrebindableます。
(スマート参照ではなくスマートポインタなどを明示的に逆参照でのコンテンツ.)
こauto_ptrが必要なので必要なのは隙間を埋めるために種類がない swap
機能です。ものすべての標準器ます。
- ワンオーナー:通称コピー削除
- std::auto_ptr
時のクリエイター-オブ-ザ-イヤーオブジェクトいを明示的に手権には、誰か他の人.この方法を文書にコードをまといなくなっ追跡でいただくには削除してください。