スマートポインタの概念と実装

ブックカバー

コンセプト

スマートポインタ文字通り、最初のオブジェクトであり、その行動(またはインタフェース)は、シミュレーション内のポインタが、ポインタよりインテリジェントです。ポインタの主な役割は、参照リソースで、ポインタがリソースに良い、それポイントのライフサイクルを管理することは困難で複雑な状況での最大の問題です。やることがスマートポインタは、この問題のリソースのライフサイクルの管理に、より「インテリジェント」です。C ++ 11のすでに<memory>提供される3つの共通モジュールスマートポインタ、unique_ptr, shared_ptrおよびweak_ptr

しかし、スマートポインタは、原理を理解し、実装の詳細も非常に重要です。ただ、他の標準的なSTLのSTLツールのようなポインタ、生産現場の絶対多数のための機能性と効率性を確保するために、しかし、個々のケースでは最高ではないかもしれない;、標準オファーのより合理的な利用を確保することができます機能性と効率性を確保するために、スマートポインタの原則を理解します良い、あまりにも肥大化し、過度に官僚的な選択、そして時にはあなたは実装の詳細を理解することができれば、我々はトリミングされたバージョンやスマートフォンの修正バージョンを達成することができ、(個人が、そのようなTIのTMS320シリーズのコンパイラとして、C ++ 11組み込み開発をサポートしていません)を使用することはできません機能性と効率性を必要とすることを確実にするために、ポインタの追求を最大化します。

よるとアンドレイアレキスマートポインタの最初のポリシー・ポイントを記載されている書籍「現代C ++の設計」の考え方では、機能ブロックは可変であり、その後、次のセクションで実現する場合の注意事項を説明しています。

  • ストレージ:汎用ポインタをシミュレートするために、最初のスマートポインタ、そのストレージ・リソースへの汎用ポインタの最も重要な機能を実行する必要がある:->,*元のリソース制御へのオペレータのアクセス;
  • 所有者:所有権は、他のリソースのライフサイクル管理として知られている、いわゆるインテリジェントな管理の一部です。
  • 値の意味:汎用ポインタとは異なり、それはオブジェクトであるため、それが合理的に等しい比較を達成する必要がある、「値セマンティクス」を有する、変換動作のタイプ;
  • エラー、例外管理。

実現

メモリ

スマートポインタは、ハンドル、ファイルハンドル、元のポインタ、通常はテンプレート引数Tの最も重要なタイプでなく、達成する必要があることをすることができ、「ポインタ」、本当の内部リソースを持っている必要がoperator->和解参照をoperator*、そして外の世界に真のリソースへの暴露か。」ポインタ。 " やり方を演算子オーバーロードは、shared_ptrの目安として、C ++メンバ関数を理解し、実装することは比較的容易ですが、露光元「ポインタ」::を取得、必ずしも最良の方法。これは、すべての後に、オブジェクトのインタフェースへのポインタがありそうなコードを読んで、原因のトラブルに、get関数、メンバ関数によって公開元のリソースポインタがあるだろうことは避けられない、UFの元グローバル関数に優れています。また、デフォルトで呼ばれる資源の破壊、時のTのデストラクタである、それはまた、資源の破壊の原因であるとのインタフェースのテンプレートを提供することができます。

所有権

所有権は、コンストラクタ、デストラクタの理由の3種類に反映され、代入演算子の振る舞いをコピーするように変化し、それが最も重要な標準ライブラリスマートポインタです。もっと、深いコピーを含め、コピー・オン・ライト、参照カウント、参考文献リストや破壊的なコピーで「現代C ++の設計」で提示戦略の所有権。

  • unique_ptr :コピーが許可されていないと割り当ては、唯一のコンストラクタで初期化することができ、リソース(破壊的なコピー)のデストラクタの破壊;
  • shared_ptr :コピーは、スマートポインタのすべてのリソースへの記録やポイント、許可および割り当て、リソースはスマートポインタで最初に初期化されたスマートポインタへの最後のリソースのデストラクタへのポインタを割り当てられている場合、スマートポインタ参照リソースの記録を開始します記録及びリソース構成(参照カウントコピー)を破壊するための機能と、
  • weak_ptr:で使用されているshared_ptrのオブザーバーとして、及びshared_ptr場所「あなたが私を指して、そして私はあなたを指して、」メモリリークが発生を防止するために循環参照にポインタシステムがあるかもしれません。したがって、コンストラクタ受信する必要があるshared_ptrweak_ptr(コピーコンストラクタ)は、リソースが直接受け入れることができない「ポインタを。」必要なときにコピーでは、リソースの割り当ては、常にのshared_ptrの内部構造、破壊に資源を破壊しないどんなにを監視し、記録します。

値の意味

  • まず、我々は、元のポインタに暗黙の型変換を実装することを推奨されていない、生のリソースを直接浴びることはお勧めしません。あなたがこれを持っている場合は、禁止する必要があるdelete(でスマートポインタに直接的な役割を、そうでないか、スマートポインタと呼ばvoid*作り、暗黙の型変換deleteの正確なメソッド呼び出しがデストラクタを確認することはできません)。
  • 等価演算子と同じではないに等しく、リソースを意味し、「ポインタ」が一致するようにしてください。同等の効果このような決意は、リソースへの生ポインタが同じであるかどうかを決定することである。最初に達成することができないbool暗黙的型変換、または等価比較演算範囲(a == b; a != b)最初のスマートポインタ演算子の両側ため、有効となります暗黙的に変換bool等しく比較またはない、ロジックは明らかに望ましくありません。問題の結果として得られるようなコードがされなくなりif (p)、最大で、!演算子オーバーロードすることにより、このような動作を実現することができますif(!p)一方、継承する基底クラスとサブクラスを比較するために、だけでなく、最良の比較演算テンプレートクラスの種類を達成するためです。
  • 操作の順序を比較すると、原理は次の2つのポインタのサイズを比較したいだまされ、比較は、メモリ空間の連続性を開く、これは順序であることを意味し、メモリアドレス、ある、とメモリ空間を必要としない、これは多くの場合ではありません資源の破壊のオープンでインテリジェントな管理。だから、比較動作原理は、スマートポインタの減算、サイズを実装する必要があります。あなたが達成した場合は、比較演算のみを達成することができ<、および>オペレータは、彼らが他の間接的な影響を持っています。他のオペレータ、左実現することが可能である<>実装か否かを、ユーザによって決定された順序を比較するためのグローバル比較動作を。

エラー例外管理

また、決定ヌルポインタ、受信可能な再コンストラクタ機能するかどうかを決定するために、->ポインタがNULLのプリフライトであるかどうかかどうかをオペレータに。->検出オペレータの頻繁な使用->パフォーマンスへの影響は、いつ操作者が明らかになったであろう。

リファレンス実装

「現代のC ++の設計」

アンドレイAlexandreu戦略的なポイントで、この本の切断部位一つ一つの主題では、私はそれが変化点として理解することができると考え、これらの戦略のポイントは、抽象インタフェース・クラスとなり、その後、テンプレートは、アセンブリこれらの抽象インタフェースのオブジェクトになります。彼らの戦略のエンティティクラスを実装することで、あなたは異なるの機能、性能、同じ意味オブジェクトを組み立てることができます。柔軟性が非常に大きい。このように、性能も多重継承よりも高いですが、コンパイラのプレゼントはずっと挑戦のではなく、あまりにも主流のデザインになります。実際には、コードの設計と読みやすさは非常に有利ですが、あまりにも多くのC ++のテンプレート奇数変態スキルは、学習し、大きすぎるA障壁を作るために、この設計方法を普及します。

おすすめ

転載: www.cnblogs.com/songyuncen/p/12076162.html