問題タブ [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 に答える
526 参照

c++ - std::weak_ptr を使用した共有リソースの所有権

(C++ 11を使用し、できれば下位(ブーストまたはTR1)互換のスマートポインタータイプを使用して)達成する方法について疑問に思っています:

1 つのクラス インスタンス ( ModelController) がリソース ( ) を所有し、InputConsumer別のコンポーネント ( InputSender、この場合はシングルトン) がそのリソースにアクセスできます。

モデルはInputSenderへの参照のリストを保持しておりInputConsumers、その中には多くのものがあります。

ModelControllerには、 がまったくないか、1 つまたは多く含まInputConsumersれている可能性があり、 が多数含まれている可能性がありますModelController。はInputSender認識していません。

これが良いことです:個人が有効かどうかを自分で確認できるように、割り当てられたものInputSenderを追跡する方法。InputConsumersInputConsumers

weak_ptrそれらの使用にはこの条件を確認する必要があるため、この目的には完璧だと思います。

InputSenderがその参照のいずれかの追跡を停止した場合weak_ptr、悪いことは何も起こらず、対応するInputConsumerは無線沈黙を経験するだけです。

が削除された場合ModelController、またはがそののModelController一部を削除した場合、それらに登録されている は、次にアクセスしようとしたときに、存在しないことを認識し、メッセージを送信する必要なくクリーンアップできます。または何でもします。InputConsumerInputSender

shared_ptr問題は、これはandを使用するのに適した状況weak_ptrですか? s は概念的に s によって所有されているため、メンバー変数にする必要があるshared_ptrため、完全に適切かどうか疑問に思います。経由でのみ管理することがどれほど意味があるのか​​ わかりません。と一緒に動作するかどうかはわかりません。のctor / dtorでsを管理するだけですか?InputConsumerModelControllerModelControllershared_ptrunique_ptrweak_ptrshared_ptrModelController

また、よく知られた (私にはわからない!) これが当てはまるデザイン パターンがあるかもしれないので、そのようなことを知っている人がいたら教えてください。

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

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 になります!

どうして??

0 投票する
5 に答える
665 参照

c++ - 参照が破棄される前に通知する必要がある非所有参照を格納するオブジェクト

私はこのパターンに従うクラスを持っています:

Fooオブジェクトはすべて によって所有されていますBar:

もちろん、これはアイデアを得るための単純化された例です。Foos のループがないこと、およびリンクされ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、所有権のレベルが異なる のように:

何かご意見は?

0 投票する
3 に答える
4751 参照

c++ - コンテナー内の weak_ptrs を取り除く方法

コンテナーに weak_ptrs を格納し、weak_ptr の有効期限が切れていない場合に後で何かを行うクラスがあります。

Exampleが永久に存続し、定期的に使用されるオブジェクトである場合fill、ベクトルは要素にメモリを継続的に割り当てますが、有効期限が切れた後に要素が削除されることはありません。

コンテナ内の期限切れのweak_ptrsを自動的に取り除くC++の方法はありますか、それともそれらの可変数を保存するより良い方法はありますか?

私の素朴な方法は、呼び出されるたびにコンテナーを反復処理しfill、期限切れのすべてのweak_ptrsを削除することです。コンテナ内に多くの要素があり、fill が頻繁に呼び出されるシナリオでExampleは、これは非常に非効率的です。

0 投票する
5 に答える
18569 参照

c++ - 生ポインタからweak_ptr<>を作成する

開発中のクラス内での削除を防ぐために、生のポインター メンバーをスマート ポインターにラップしたいと思います。ポインターの下のオブジェクトの所有者はクラス外です。だから、似boost::shared_ptrstd::auto_ptrいて合わない。以下は縮小された例です。

もちろん、コンパイルエラーを誘発します。weak_ptr生のポインターから初期化する正しい方法は何ですか(存在する場合)?

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

c++ - C++ の weak_ptr 作成パフォーマンス

std::shared_ptr の作成またはコピーには、いくつかのオーバーヘッド (参照カウンターのアトミック インクリメントなど) が含まれることを読みました。

しかし、代わりにそれから std::weak_ptr を作成するのはどうですか:

パフォーマンスが向上することを期待していましたが、共有ポインターがまだ弱い参照カウンターをインクリメントする必要があることはわかっています..だから、これはまだshared_ptrを別のものにコピーするのと同じくらい遅いですか?