問題タブ [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.

0 投票する
2 に答える
99 参照

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これは可能ですか?

0 投票する
1 に答える
299 参照

c++ - std::shared_ptr のコンテナー ( std::vector ) を std::weak_ptr のコンテナーにフィルター処理する

shared_ptr のコンテナーをフィルター処理しようとしており、フィルター処理されたコンテンツを (weak_ptr の) 所有していないコンテナーに保存しようとしています。以下のプログラムがクラッシュします。私が欠けているものを見ることができますか?

0 投票する
1 に答える
1407 参照

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 つの (反比例する) キャストを実行する効率的な方法ですか? 私はこれらのポインターを効率的に使用する方法を把握しようとしているので、一般的な意見や参考資料をいただければ幸いです。

0 投票する
1 に答える
42 参照

c++ - 単純な引数の転送 (署名はどうすればよいですか?)

例として、ベクターの push_back メソッドの薄いラッパーを書いているとします。

私の質問は、関数の正しい署名は何myPushBackですか? それから私の次の質問は、タイプが のmyPushBack場合、関数の正しい署名は何でしょうか?vecstd::vector<weak_ptr<Bar>>

0 投票する
1 に答える
975 参照

c++ - shared_ptr が含まれているのと同じアドレスにリセットされたときに、weak_ptr が期限切れになることが保証されていますか?

shared_ptr が含まれているのと同じアドレスにリセットされたときに、weak_ptr が期限切れになることが保証されていますか?

または、これは の値がwi.expired()定義されていない場合に当てはまりますか?

編集:

質問を少し変更します。

が初期化されたときに含まれていた同じアドレスにリセットされたweak_ptrときに期限切れになることが保証されていますか?shared_ptrshared_ptrweak_ptr

0 投票する
1 に答える
235 参照

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メカニズム全体を壊すことができるため、明らかな欠点があります。

0 投票する
2 に答える
455 参照

c++ - shared_ptrにおけるweak_ptrの役割

weak_ptr の役割を除いて、shared_ptr がどのように機能するかを理解しています。参照カウントがゼロでない場合に循環参照を検出することは理解していますが、これを超えると、これがどのように行われるのか正確にはわかりません。それは何をするためのものか?