問題タブ [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++ - std::weak_ptr を使用した共有リソースの所有権
(C++ 11を使用し、できれば下位(ブーストまたはTR1)互換のスマートポインタータイプを使用して)達成する方法について疑問に思っています:
1 つのクラス インスタンス ( ModelController
) がリソース ( ) を所有し、InputConsumer
別のコンポーネント ( InputSender
、この場合はシングルトン) がそのリソースにアクセスできます。
モデルはInputSender
への参照のリストを保持しておりInputConsumers
、その中には多くのものがあります。
ModelController
には、 がまったくないか、1 つまたは多く含まInputConsumers
れている可能性があり、 が多数含まれている可能性がありますModelController
。はInputSender
認識していません。
これが良いことです:個人が有効かどうかを自分で確認できるように、割り当てられたものInputSender
を追跡する方法。InputConsumers
InputConsumers
weak_ptr
それらの使用にはこの条件を確認する必要があるため、この目的には完璧だと思います。
InputSender
がその参照のいずれかの追跡を停止した場合weak_ptr
、悪いことは何も起こらず、対応するInputConsumer
は無線沈黙を経験するだけです。
が削除された場合ModelController
、またはがそののModelController
一部を削除した場合、それらに登録されている は、次にアクセスしようとしたときに、存在しないことを認識し、メッセージを送信する必要なくクリーンアップできます。または何でもします。InputConsumer
InputSender
shared_ptr
問題は、これはandを使用するのに適した状況weak_ptr
ですか? s は概念的に s によって所有されているため、メンバー変数にする必要があるshared_ptr
ため、完全に適切かどうか疑問に思います。経由でのみ管理することがどれほど意味があるのか わかりません。と一緒に動作するかどうかはわかりません。のctor / dtorでsを管理するだけですか?InputConsumer
ModelController
ModelController
shared_ptr
unique_ptr
weak_ptr
shared_ptr
ModelController
また、よく知られた (私にはわからない!) これが当てはまるデザイン パターンがあるかもしれないので、そのようなことを知っている人がいたら教えてください。
c++ - weak-ptr が null になり、アプリが毎週 1 回クラッシュする
RFNReader_NFCP.exe.4448.dmp の 0x764F135D (kernel32.dll) で未処理の例外: 0xC0000005: アクセス違反の書き込み場所 0x00000001。
変数itemのデバッグ ウィンドウでの値:
item shared_ptr {m_interface="10.243.112.12" m_port="8889" m_clientSockets={ size=0 } ...} [3 つの強い参照、2 つの弱い参照] [デフォルト] std:: tr1::shared_ptr
しかし、item->Update() では
、item(this)が null になります!
どうして??
c++ - 参照が破棄される前に通知する必要がある非所有参照を格納するオブジェクト
私はこのパターンに従うクラスを持っています:
Foo
オブジェクトはすべて によって所有されていますBar
:
もちろん、これはアイデアを得るための単純化された例です。Foo
s のループがないこと、およびリンクされFoo
た s がすべて の同じインスタンスに属していることを保証しますBar
。ここまでは順調ですね。C++11 のやり方で物事を行うには、 in を使用vector< unique_ptr<Foo> > foos_;
し、コンストラクターの潜在的な引数としてBar
渡します。foos_[i].get()
Foo
契約があります:
これは GUI アプリケーションであり、ユーザーはインタラクティブに一部Foo
を自由に削除できます。予想される動作は、foo1
が削除され、foo2
に対して相対的である場合、 「絶対」foo1
になることです。foo2
バックポインターを含む DAG 構造を使用することにより、生のポインターを使用してそれを行うことができることを知っているので、Foo
誰が「それらに依存している」かを認識し、削除する前にそれらを通知できます (可能な解決策については、こちらとこちらで詳しく説明しています)。
私の質問は次のとおりです。同じように処理しますか? 標準の C++11 スマート ポインターを使用して、明示的なバックポインターを回避areRelativeToMe_[i]->convertToAbsolute();
し、デストラクタで明示的に呼び出すことを回避する方法はありFoo
ますか? 私は次のようなことを考えてweak_ptr
いました:
しかし、問題はconvertToAbsolute()
、相対Foo
がまだ存在する必要があることです。したがって、「この参照は論理的に期限切れです」と伝えることができる非所有のスマートポインターが必要ですが、実際には、参照されたオブジェクトが不要になるまで、その有効期間を延長します。
weak_ptr
他のものと共有されなくなるまで、有効期間を延長するように見える可能性がありますweak_ptr
。
またはshared_ptr
、所有権のレベルが異なる のように:
何かご意見は?
c++ - コンテナー内の weak_ptrs を取り除く方法
コンテナーに weak_ptrs を格納し、weak_ptr の有効期限が切れていない場合に後で何かを行うクラスがあります。
Example
が永久に存続し、定期的に使用されるオブジェクトである場合fill
、ベクトルは要素にメモリを継続的に割り当てますが、有効期限が切れた後に要素が削除されることはありません。
コンテナ内の期限切れのweak_ptrsを自動的に取り除くC++の方法はありますか、それともそれらの可変数を保存するより良い方法はありますか?
私の素朴な方法は、呼び出されるたびにコンテナーを反復処理しfill
、期限切れのすべてのweak_ptrsを削除することです。コンテナ内に多くの要素があり、fill が頻繁に呼び出されるシナリオでExample
は、これは非常に非効率的です。
c++ - 生ポインタからweak_ptr<>を作成する
開発中のクラス内での削除を防ぐために、生のポインター メンバーをスマート ポインターにラップしたいと思います。ポインターの下のオブジェクトの所有者はクラス外です。だから、似boost::shared_ptr
てstd::auto_ptr
いて合わない。以下は縮小された例です。
もちろん、コンパイルエラーを誘発します。weak_ptr
生のポインターから初期化する正しい方法は何ですか(存在する場合)?
c++ - C++ の weak_ptr 作成パフォーマンス
std::shared_ptr の作成またはコピーには、いくつかのオーバーヘッド (参照カウンターのアトミック インクリメントなど) が含まれることを読みました。
しかし、代わりにそれから std::weak_ptr を作成するのはどうですか:
パフォーマンスが向上することを期待していましたが、共有ポインターがまだ弱い参照カウンターをインクリメントする必要があることはわかっています..だから、これはまだshared_ptrを別のものにコピーするのと同じくらい遅いですか?