5

私はunique_ptrvs shared_ptrvsの使用について熟考してきましたown_solution。ほぼ間違いなく間違いを犯すので、後者を割引しましたが、両方に問題があり、unique_ptrどちらshared_ptrも私が望むものを正確に捉えていません。リソースを明示的に所有するリソース マネージャーを作成したいのですが、リソース マネージャーがリソースへの参照も配布するようにしたいと考えています。

リソースマネージャーで使用unique_ptrして生のポインターを渡すと、他の場所に逃げる可能性があります (ただし、これはクラスの「契約」に反すると思います)。を使用shared_ptrして配布すると、呼び出し元が を に変換して保存するのをweak_ptr止めるものは何もないため、サイクルが発生する可能性があり、さらに悪いことに、リソース マネージャーの有効期間を超えてリソースが存続する可能性があります。だから私が探しているのは、に変換できないdeferencable だと思います。weak_ptrshared_ptrweak_ptrshared_ptr

それとも、コード内のいくつかの強い言葉のコメントで契約を強制しようとしているだけですか?

これについてご意見をお寄せいただきありがとうございます。

4

3 に答える 3

9

In the end, you cannot force anyone to listen. Ask at microsoft, apple or any open source library developer, they all know that song. A comment in the right words and places is your best bet.

Avoid creating your own smart pointer class, it hinders composition and reduces readability. As a last resort, try looking in boost, or any framework your code already has to work with.

If you have non-owners, they are either electable for holding weak_ptrs or (if it is guaranteed to stay valid for the duration) raw pointers.
If you use shared_ptrs internally (why should you), best provide weak_ptr and raw pointers.

All those smart pointers explicitly denote an ownership policy. Raw pointers denote none or non-owning.

  • auto_ptr: Do not use, deprecated with too many traps even for the wary.
  • unique_ptr: Sole ownership.
  • shared_ptr: Shared ownership
  • weak_ptr: No ownership, might get deleted behind your back.
  • raw pointer
    • Explicitly no ownership with guaranteed bigger lifetime
    • or manual ownership management.
于 2014-04-11T15:34:00.430 に答える
6

のようなスマート ポインターは、ポインターを所有しshared_ptrunique_ptrいる場合に適したツールです。 しかし、所有していないポインター、つまりポインターを監視する場合は、生のポインターを使用しても問題ありません。

あなたの設計では、リソースマネージャーがリソースの唯一の「所有者」であると思うので、リソースマネージャーに何らかの形のスマートポインターを単純に持つことができます。たとえば、リソース マネージャーは をstd::vector<std::unique_ptr<Resource>>データ メンバーとして持つことができます。また、クラスが に正しく格納できるように設計されているstd::vector<Resource>場合は、より単純になります。Resourcestd::vector

次に、リソース マネージャーは、所有していない監視ポインターのみを外部に与えることができます。この場合は、生のポインター (または C++ 参照) で問題ありません。

もちろん、リソース マネージャーの有効期間が「リソース クライアント」の有効期間を超えることが重要です。

于 2014-04-11T15:46:37.473 に答える