問題タブ [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++ - 参照がなくなったときにキャッシュから(非侵入型)スマートポインタを削除する方法は?
私の初心者の評判のため、このスレッドには返信できません。具体的には、受け入れられた回答です。
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 コンパイラーを使用していますが、ブーストはありません)、または単にそれを取得できませんか?
乾杯、ダニエル
c++ - shared_from_this とデストラクタをブーストする
クラスからデストラクタで shared_from_this を呼び出すことは許可されていないことがわかりました。
https://svn.boost.org/trac/boost/ticket/147
この動作は仕様です。デストラクタはオブジェクトを破棄するため、デストラクタが終了するとぶら下がり状態になるため、そのオブジェクトに shared_ptr を作成するのは安全ではありません。
議論は理解できますが、参照をクリーンアップするために「shared_from_this」ポインターが必要な場合はどうでしょうか (所有者シップを共有するためではありません)。
以下は、shared_ptr を使用していない例です。
ここでは、それを共有ポインターに変換しようとしました。しかし、デストラクタを終了する良い方法が見つかりません:
上記の例でデストラクタを実装するにはどうすればよいですか?
c++ - weak_ptr を使用して親への参照を保持するオブジェクトを作成するにはどうすればよいですか?
子オブジェクトへの shared_ptr を含むオブジェクトがあるとします。
子オブジェクトに親オブジェクトへの weak_ptr を持たせたいのですが、子オブジェクトのコンストラクターはどのように見え、親から子をどのように構築すればよいですか?
前もって感謝します
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
スレッド セーフの理由から、ウィーク ポインターを逆参照することはできません。ウィーク ポインターの有効期限を確認した後、それを使用する前に他のスレッドがオブジェクトを破棄した場合、クラッシュが発生します。
- それで、私はそれに対処するために何をすべきですか、なぜクラッシュするのですか(クラッシュすることはないよう
boost::weakptr<RtmpConnection>.lock()
です)? - 私のプログラムはマルチスレッドなので。の戻り値を取得して確認した後
boost::weakptr<RtmpConnection>.lock()
、RtmpConnection
他のスレッドによって破棄される可能性がありますが、Boost ライブラリは、戻り値の型が であるため、破棄されないことを保証しboost::shared_ptr<RtmpConnection>
ますか?
c++ - std::weak_ptr<> が bool 変換を提供しないのはなぜですか?
C++11 の std::shared_ptr<> は一種の bool 演算子を提供します。
( type の暗黙的なキャストによる危険性がoperator bool() const
あるため、ストレートアップではありません。)bool
std::weak_ptr<> に同様の演算子がないのはなぜですか? 常にタイピングしていることに気付く
入力したいとき
なぜweak_ptrのbool変換がないのですか?
c++ - スマート ポインターでこれを行うにはどうすればよいですか?
これが私が達成しようとしていることです:
生のポインターの代わりにスマートポインターを使用したいのですが、それらがはるかに優れていることを確認していますが、前後の切り替えを実装する方法を実際には理解できません (これは、ゲームで交代するために使用されます。Player *
)。
std::unique_ptr
ここのポインターをとstd::shared_ptr
の 2 つの別々のテストで置き換えてみました。reset
スイッチを使用して、最初のポインターの後に乱数を与えました。
次に、std::weak_ptr
インターフェイスはそれほど似ていませんが、必要なもののように見えるので試してみました。私が見てきたことから、それを使用する唯一の方法は を使用することであるため、 の呼び出しの先頭に追加して逆参照に追加lock()
しようとしましたが、クラッシュしました。lock().
reset
生のポインターの代わりにどのように使用できstd::weak_ptr
ますか、または実際に他のポインターのいずれかを使用できますか?
c++ - 適切に設計されたコードでは、weak_ptrのロックが常に成功することを期待する必要がありますか?
弱いポインタを使用してアクセスする場合は、最初に、ロックして、ポイントされたオブジェクトへの強いポインタを取得することをお勧めします。ポイントしたオブジェクトが以前に削除された場合、ロックが成功しない場合があります。
弱いポインタを決定するためにサイクルを壊すのに何か間違ったことをしなければ、ロックは成功するように私には思えます。つまり、設計をクロスチェックするためだけにロックしているのです。
これは正しいです?
キャッシングについていくつかのコメントを見ましたが、weak_ptrsの悪用のようです。しかしもちろん、ある人の虐待は別の人の革新です。意見を聞きたいです。
c++ - weak_ptrC++のコンパレータ演算子
私はまだ新しいstlメンバーの初心者ですが、このコードがセグメンテーション違反を引き起こしている理由を誰かが指摘できますか?
エラーは一列に並んでいます
if(helloSet.find(StubClass(wpPtr))!= helloSet.end())printf( "YAYA");
さらなる調査により、StubClassのコンパレータ関数が呼び出されたときに問題があることが明らかになりました。ここでプログラムをコンパイルしています
編集:
これで問題は解決しました。もっと読む必要があります。:(とにかく、コミュニティの誰もが最初のコードがSIGSEGVを与える理由を説明できます。私は最終的にそれを理解しましたが、それでも良い説明は害にはなりません。:)
c++ - std::weak_ptrを取得するにはどうすればよいですかこのポインタから?
次に例を示します。
どうやってするか?MyClass
から派生する必要がある場合、すでに別の祖先から派生しているstd::enable_shared_from_this<MyClass<T>>
ため、多重継承なしでそれを行うにはどうすればよいですか?コンストラクターを呼び出す必要がありますか?MyClass
T
shared_from_this()
私の場合、T
から継承されたクラスである可能性がありますenable_shared_from_this<T>
が、常にではありません
c++ - nullptr を weak_ptr<> にキャストできない理由
私はこれをしたい:
または、weak_ptr 引数のデフォルト値は次のように null です。
しかし、私が必要とするのは、代わりにこれを行うことです:
何故ですか?