問題タブ [weak-ptr]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - この例で shared_ptrs を使用できますか?
問題を引き起こしている単純なイベント処理システムがあります。それを使用するには、 class から継承しEventHandler
ます。コンストラクターは、構築時に各オブジェクトを登録します。
EventHandler
のコンストラクタは次のとおりです。
これは、これをベクトルに格納するEventDispatcher
のメンバー関数を呼び出します。registerListener()
mLisernerList は次のようになります。
は、ベクターの各要素に対して をEventDispatcher
呼び出してsendEvent()
、イベントを通知するだけです。
私の問題を示すために例を挙げましょう。私のクラスButtons
がから継承しているとしましょうEventHandler
。ヒープ上にボタン オブジェクトを作成し、すべてのボタンへのスマート ポインターを 1 つのベクターに配置します。
何が起こるかとunique_ptr
いうと、mButtons の s のベクトルと、同じ動的に割り当てられた Button オブジェクトを指す mListenerList の生ポインタのベクトルになります。同じオブジェクトを指すスマート ポインターと生のポインターは必要ありません。
理想的には、作成時に EventHandler がすべてのオブジェクトを登録できるようにしながら、動的に割り当てられた Button オブジェクトを指す mButtonsshared_ptr
の s のベクトルと mListenerList のs のベクトルが必要です。weak_ptr
これは可能ですか?
c++ - std::shared_ptr のコンテナー ( std::vector ) を std::weak_ptr のコンテナーにフィルター処理する
shared_ptr のコンテナーをフィルター処理しようとしており、フィルター処理されたコンテンツを (weak_ptr の) 所有していないコンテナーに保存しようとしています。以下のプログラムがクラッシュします。私が欠けているものを見ることができますか?
c++ - C++ 11 スマート ポインターの所有権とキャスト
基本エンティティ クラスと、牛や鶏などの派生クラスがあります...
std スマート ポインターを使用してメモリを適切に管理する方法を学習しようとしています。私が今やっている方法では、派生クラスが存在する唯一の場所は、次のような共有ポインターのベクトルです...
私の Entity クラスは、同じタイプであるかどうかにかかわらず、2 つのエンティティ間の関係の管理を担当します。これを行うために、次のような Relationship オブジェクトのリストを保持しています...
牛や鶏が死ぬ可能性があるため、弱いポインターを使用します。その場合、他のエンティティとの関係が無効になるはずです。
だからここに私の問題があります。すべてを派生クラスへの共有ポインターとして保存しますが、Entity クラス内のすべてのコードは、基本クラスへの弱いポインターを使用します。弱いエンティティ ポインタを共有 Cow ポインタに変換したり、共有 Cow ポインタを弱いエンティティ ポインタに変換したりする必要がある場合がいくらかあります。
どういうわけか、私のコードでは、上記の Entity クラスの createRelationship(...) のパラメーターで shared_ptr オブジェクトを渡すことができます。なぜそれがコンパイルされるのかよくわかりません。それが効率的かどうか知りたいです。代わりに、手動で弱いポインターに変えてから、static_pointer_cast を使用してキャストする必要がありますか? (共有ポインタをパラメータとして渡すのが遅いことを読んだので、これを尋ねます。それが起こっているのではないかと心配しています)。
逆に、同じタイプの 2 つのエンティティ間に特定の関係があることを知っていることがあります。私の要点を説明すると、親から遺伝学を継承する必要がある子牛です。子牛はその関係を検索して親子関係を見つけ、親への弱いエンティティ ポインターにアクセスします。それらの遺伝メンバー変数にアクセスするには、エンティティへのこれらの弱いポインターを、Cow への共有ポインターにキャストする必要があります。これを達成するために、weak_ptr.lock() に続いて dynamic_pointer_cast を使用しています。
これは、これら 2 つの (反比例する) キャストを実行する効率的な方法ですか? 私はこれらのポインターを効率的に使用する方法を把握しようとしているので、一般的な意見や参考資料をいただければ幸いです。
c++ - 単純な引数の転送 (署名はどうすればよいですか?)
例として、ベクターの push_back メソッドの薄いラッパーを書いているとします。
私の質問は、関数の正しい署名は何myPushBack
ですか? それから私の次の質問は、タイプが のmyPushBack
場合、関数の正しい署名は何でしょうか?vec
std::vector<weak_ptr<Bar>>
c++ - shared_ptr が含まれているのと同じアドレスにリセットされたときに、weak_ptr が期限切れになることが保証されていますか?
shared_ptr が含まれているのと同じアドレスにリセットされたときに、weak_ptr が期限切れになることが保証されていますか?
または、これは の値がwi.expired()
定義されていない場合に当てはまりますか?
編集:
質問を少し変更します。
が初期化されたときに含まれていた同じアドレスにリセットされたweak_ptr
ときに期限切れになることが保証されていますか?shared_ptr
shared_ptr
weak_ptr
shared-ptr - std::weak_ptr から std::shared_ptr への変換を無効にする
私はそのように「宣伝」できることを知っていweak_ptr
ますshared_ptr
:
私の質問は次のとおりです。それを何とか防ぐことはできますか?
演習として、私は独自の非常に単純な WeakPtrFactory の実装を作成したいと考えました。this
これはクラス メンバーとして開始され、weak_ptr
オブジェクトの破棄時に無効化される s を生成します。私の試みは単にshared_ptr
プライベートメンバーとして使用されweak_ptr
、それで作成された s が返されました(念のために op deleter は渡されません)。しかし、誰もがそれらを昇格させてshared_ptr
メカニズム全体を壊すことができるため、明らかな欠点があります。
c++ - shared_ptrにおけるweak_ptrの役割
weak_ptr の役割を除いて、shared_ptr がどのように機能するかを理解しています。参照カウントがゼロでない場合に循環参照を検出することは理解していますが、これを超えると、これがどのように行われるのか正確にはわかりません。それは何をするためのものか?