2017-04-03 2 views
1

ライフタイムコントロールと弱い参照の利点を同時に得る標準的な方法が見つかりませんでした。私はこの問題に遭遇する唯一の人だとは信じられません。

この動作を可能にするものは、標準または追加で何かありますか? 完全なsmart_ptrクラスを書き直すことなくこれを可能にするパターンがありますか?

+0

関連http://stackoverflow.com/questions/17536731/shared-ptr-is-to-weak-ptr-as-unique-ptr-is-to-what。 'std :: experimental :: observer_ptr'もありますが、unique_ptrが削除されてもnullにはなりません。 – kennytm

+4

これは 'weak_ptr'の一種のポイントです。クライアントが参照されたオブジェクトを使用すると、クライアントは参照されたオブジェクトを使用期間中共有に変換して、削除されないようにします。 'weak_ptr'を所有しているクライアントは、オブジェクトを使用する前に、オブジェクトの存続期間の部分的所有権を引き受ける何らかの方法を必要とします。 – lcs

+0

unique_ptrの場合、weak_ptrのようなメカニズムは必要ありません。その中に格納されているオブジェクトの存続期間は、すべての参照の存続期間を超えなければならず、このオブジェクトを参照するすべてのコードは、コードのある部分が実際にそのオブジェクトが存在しないことを期待している場合は、[boost :: optional_reference](http://www.boost。org/doc/libs/1_63_0/libs/optional/doc/html/boost_optional/tutorial/optional_references.html)を参照してください。 – dodo951

答えて

-1

いいえ、それを行うための標準的な方法はありません。

解決策は、すべてのオブジェクトにunique_idsを追加することです。弱い参照を必要とするすべての人物にIDを格納します。

次に、パブリックメソッドfindById(id)を使用して、これらのオブジェクトのunique_ptrのマップを保持するManagerがあります。

このようにして、メモリ割り当てはマネージャによって完全に制御され、誰でも弱い参照を保持することができます。

+1

これは動作しません。あなたは 'findById(id)'を呼び出して、他の何かがその寿命をコントロールしているので、いつでも消えるかもしれないオブジェクトを返すでしょうか?それをどうやって使うことができますか?これは、強力なポインタに昇格できない弱いポインタとまったく同じで無駄です。 –

+0

そうです、findById(id)は、使用前にテストしなければならないTransientPtrと呼ばれるものを返し、コピーも格納もできません。だから、私はこのオブジェクトを非常に短い範囲で使用します。私が使用するスコープでそれを破壊しない限り、問題はありません。カスタムのweak_ptrには、私が思うのと同じ問題があります。それを強力なポインタに昇格できない場合、shared_ptrがまだ生存していることを確認しながらそれを使用する方法はありません。そして、カスタムweak_ptrを上回る利点は、私の場合、オブジェクトを後で(サーバから)破棄して再作成することができ、IDが有効であるということです。 – Nicolas

+0

それでは、IDを気にするのはどうしてですか?どうして 'weak_ptr'を' TransientPtr'に変換するだけのクラスでラップしてみませんか?ラップされた 'weak_ptr'はIDの目的を果たし、' TransientPtr'に変換する関数は 'findById'の目的を果たします。 IDは意味がありません。 –

1

ライフタイムを制御したい場合は、弱いポインタではありません。

弱いポインタを共有ポインターにアップグレードすることができます。したがって、所有権を共有したくない場合は、参照/生ポインタを渡す必要があります。

weak_ptrをラップし、インターフェイス全体を公開しないことで、独自の種類のobserver_ptrを作成できます。しかし、これはマルチスレッド設定(恐らくshared_ptrが繁盛する唯一の設定)で安全になるのは難しいでしょう。

0

あなたは不可能なことを求めています。

オブジェクトには、オブジェクトにアクセスしている時間をカバーするためにオブジェクトの存続期間を延長できないコードから安全にアクセスすることはできません。

外部コードによるオブジェクトへのアクセスを許可するには、そのコードがオブジェクトにアクセスしている時間をカバーするようにオブジェクトの有効期間を延長することも許可する必要があります。

関連する問題