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

c++ - 参照がなくなったときにキャッシュから(非侵入型)スマートポインタを削除する方法は?

私の初心者の評判のため、このスレッドには返信できません。具体的には、受け入れられた回答です。

boost::intrusive スマート ポインターを使用したことはありませんが、shared_ptr スマート ポインターを使用する場合は、キャッシュに weak_ptr オブジェクトを使用できます。

これらの weak_ptr ポインターは、システムがメモリを解放することを決定したときに参照としてカウントされませんが、オブジェクトがまだ削除されていない限り、shared_ptr を取得するために使用できます。

これは確かに直感的な考えですが、C++ 標準は weak_ptrs の比較をサポートしていないため、連想コンテナーのキーとして使用することはできません。これは、weak_ptrs の比較演算子を実装することで回避できます。

このソリューションの問題は、

(1) 比較演算子は、比較ごとに所有権を取得する必要があります (つまり、weak_ptr 参照から shared_ptrs を作成します)。

(2) リソースを管理する最後の shared_ptr が破棄されても、weak_ptr はキャッシュから消去されませんが、期限切れの weak_ptr がキャッシュに保持されます。

(2) については、カスタム デストラクタ ( DeleteThread ) を提供できますが、これには、削除する T* から weak_ptr を作成する必要があり、キャッシュから weak_ptr を消去するために使用できます。

私の質問は、スマートポインターを使用したキャッシュへのより良いアプローチがあるかどうかです (私は VC100 コンパイラーを使用していますが、ブーストはありません)、または単にそれを取得できませんか?

乾杯、ダニエル

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

c++ - shared_from_this とデストラクタをブーストする

クラスからデストラクタで shared_from_this を呼び出すことは許可されていないことがわかりました。

https://svn.boost.org/trac/boost/ticket/147

この動作は仕様です。デストラクタはオブジェクトを破棄するため、デストラクタが終了するとぶら下がり状態になるため、そのオブジェクトに shared_ptr を作成するのは安全ではありません。

議論は理解できますが、参照をクリーンアップするために「shared_from_this」ポインターが必要な場合はどうでしょうか (所有者シップを共有するためではありません)。

以下は、shared_ptr を使用していない例です。

ここでは、それを共有ポインターに変換しようとしました。しかし、デストラクタを終了する良い方法が見つかりません:

上記の例でデストラクタを実装するにはどうすればよいですか?

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

c++ - weak_ptr を使用して親への参照を保持するオブジェクトを作成するにはどうすればよいですか?

子オブジェクトへの shared_ptr を含むオブジェクトがあるとします。

子オブジェクトに親オブジェクトへの weak_ptr を持たせたいのですが、子オブジェクトのコンストラクターはどのように見え、親から子をどのように構築すればよいですか?

前もって感謝します

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

c++ - boost::weak_ptr.lock() が SIGSEGV セグメンテーション違反でクラッシュする

(編集) 環境:

私はサーバー側のプロジェクトに取り組んでいます。boost::asio、 、boost::shared_ptr、などのブースト ライブラリを使用しboost::weak_ptrます。

Boost のドキュメント ( http://www.boost.org/doc/libs/1_47_0/libs/smart_ptr/weak_ptr.htm#lock ) には、weak_ptr<T>.lock決してスローしないと書かれています。

ロック

shared_ptr lock() const; 戻り値: 期限切れ()? shared_ptr(): shared_ptr(*this).

スロー: なし。

ただし、私のアプリケーションでは、クラッシュさえしました。

回線がクラッシュしたことを確認しました/usr/local/include/boost/smart_ptr/detail/sp_counted_base_gcc_x86.hpp

92行目はアセンブリコードです。私は本当にそれが何を意味するのか分かりません。

boost::weakptr<RtmpConnection>.lock()使用する前に、返された(type ofboost::shared_ptr<RtmpConnection>が空であるかどうかを常に確認します。

だから私はグーグルで、これを見ましたhttp://wiki.inkscape.org/wiki/index.php/Boost_shared_pointers

スレッド セーフの理由から、ウィーク ポインターを逆参照することはできません。ウィーク ポインターの有効期限を確認した後、それを使用する前に他のスレッドがオブジェクトを破棄した場合、クラッシュが発生します。

  1. それで、私はそれに対処するために何をすべきですか、なぜクラッシュするのですか(クラッシュすることはないようboost::weakptr<RtmpConnection>.lock()です)?
  2. 私のプログラムはマルチスレッドなので。の戻り値を取得して確認した後boost::weakptr<RtmpConnection>.lock()RtmpConnection他のスレッドによって破棄される可能性がありますが、Boost ライブラリは、戻り値の型が であるため、破棄されないことを保証しboost::shared_ptr<RtmpConnection>ますか?
0 投票する
1 に答える
2306 参照

c++ - std::weak_ptr<> が bool 変換を提供しないのはなぜですか?

C++11 の std::shared_ptr<> は一種の bool 演算子を提供します。

( type の暗黙的なキャストによる危険性がoperator bool() constあるため、ストレートアップではありません。)bool

std::weak_ptr<> に同様の演算子がないのはなぜですか? 常にタイピングしていることに気付く

入力したいとき

なぜweak_ptrのbool変換がないのですか?

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

c++ - スマート ポインターでこれを行うにはどうすればよいですか?

これが私が達成しようとしていることです:

生のポインターの代わりにスマートポインターを使用したいのですが、それらがはるかに優れていることを確認していますが、前後の切り替えを実装する方法を実際には理解できません (これは、ゲームで交代するために使用されます。Player *)。

std::unique_ptrここのポインターをとstd::shared_ptrの 2 つの別々のテストで置き換えてみました。resetスイッチを使用して、最初のポインターの後に乱数を与えました。

次に、std::weak_ptrインターフェイスはそれほど似ていませんが、必要なもののように見えるので試してみました。私が見てきたことから、それを使用する唯一の方法は を使用することであるため、 の呼び出しの先頭に追加して逆参照に追加lock()しようとしましたが、クラッシュしました。lock().reset

生のポインターの代わりにどのように使用できstd::weak_ptrますか、または実際に他のポインターのいずれかを使用できますか?

0 投票する
4 に答える
1008 参照

c++ - 適切に設計されたコードでは、weak_ptrのロックが常に成功することを期待する必要がありますか?

弱いポインタを使用してアクセスする場合は、最初に、ロックして、ポイントされたオブジェクトへの強いポインタを取得することをお勧めします。ポイントしたオブジェクトが以前に削除された場合、ロックが成功しない場合があります。

弱いポインタを決定するためにサイクルを壊すのに何か間違ったことをしなければ、ロックは成功するように私には思えます。つまり、設計をクロスチェックするためだけにロックしているのです。

これは正しいです?

キャッシングについていくつかのコメントを見ましたが、weak_ptrsの悪用のようです。しかしもちろん、ある人の虐待は別の人の革新です。意見を聞きたいです。

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

c++ - weak_ptrC++のコンパレータ演算子

私はまだ新しいstlメンバーの初心者ですが、このコードがセグメンテーション違反を引き起こしている理由を誰かが指摘できますか?

エラーは一列に並んでいます

if(helloSet.find(StubClass(wpPtr))!= helloSet.end())printf( "YAYA");

さらなる調査により、StubClassのコンパレータ関数が呼び出されたときに問題があることが明らかになりました。ここでプログラムをコンパイルしています

編集:

これで問題は解決しました。もっと読む必要があります。:(とにかく、コミュニティの誰もが最初のコードがSIGSEGVを与える理由を説明できます。私は最終的にそれを理解しましたが、それでも良い説明は害にはなりません。:)

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

c++ - std::weak_ptrを取得するにはどうすればよいですかこのポインタから?

次に例を示します。

どうやってするか?MyClassから派生する必要がある場合、すでに別の祖先から派生しているstd::enable_shared_from_this<MyClass<T>>ため、多重継承なしでそれを行うにはどうすればよいですか?コンストラクターを呼び出す必要がありますか?MyClassTshared_from_this()

私の場合、Tから継承されたクラスである可能性がありますenable_shared_from_this<T>が、常にではありません

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

c++ - nullptr を weak_ptr<> にキャストできない理由

私はこれをしたい:

または、weak_ptr 引数のデフォルト値は次のように null です。

しかし、私が必要とするのは、代わりにこれを行うことです:

何故ですか?