問題タブ [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.
boost - 同じアドレス、複数の「shared_ptr」、enable_shared_from_this、カスタム デリーター
同じアドレスに関連して、複数の shared_ptr カウンターがありますが、C++ 標準で禁止されていますか? 同じオブジェクトを指しているが、基になる参照カウント構造を共有していない複数の shared_ptr オブジェクトに関するその他の無数の質問。
上記の質問でオブジェクトが「enable_shared_from_this」を継承するとどうなりますか? 私の shared_from_this() は何を返しますか? カスタムの削除機能があるものか、ないものか?
c++ - shared_ptr、scoped_ptr、weak_ptr をカバーする優れた C++ メモリ管理チュートリアルはありますか?
重複の可能性:
どの種類のポインターをいつ使用するか?
私は元 C++ プログラマーで、.NET プログラマーになりました。C++ メモリ管理に関する私の知識は 2000 年代初頭にさかのぼり、C++11 の機能についていけていません。C++ で新しいプロジェクトを行うように依頼されました。shared_ptr、weak_ptr、および scoped_ptr を使用した最新の C++ メモリ管理に関する優れたチュートリアルを見つけたいと思っています。一般的なパターンとベスト プラクティスをカバーするものが理想的です。私への指針はありますか?
c++ - weak_ptr へのバインディング
std::weak_ptr に std::bind する方法はありますか? 呼び出し先が破棄されたときに自動的に「切断」する「弱い関数」コールバックを保存したいと思います。
shared_ptr を使用して std::function を作成する方法を知っています。
ただし、返された std::function は、オブジェクトを永久に存続させます。だから私はそれをweak_ptrにバインドしたいと思います:
しかし、それはコンパイルされません。(std::bind は weak_ptr を受け入れません!) weak_ptr にバインドする方法はありますか?
これに関する議論を見つけましたが (以下を参照)、標準的な実装はないようです。特にBoostが利用できない場合、「弱い関数」を保存するための最良の解決策は何ですか?
ディスカッション/調査 (これらはすべて Boost を使用しており、標準化されていません):
- 弱関数
- weak_ptr バインディング
- 「弱い」バインディング(およびその修正)
- 弱い_fn
- 別のweak_fn
c++ - weak_ptrをrawポインターと比較しても機能せず、代替手段を探します
スプライトをロードしてキャッシュし、未使用のスプライトをキャッシュから削除するSpriteManagerクラスがあります。それはとにかくアイデアです、私は少し立ち往生しています。map<string,weak_ptr<ALLEGRO_BITMAP>>
スプライトを格納している場所があり、weak_ptrを使用してをスポーンしますshared_ptr
。今、私はマップからビットマップも削除する削除機能を使用しようとしています。これは次のようになります(明らかに機能していません)。
ビットマップは私が話していた地図です。もちろん、とを比較することはできませ(*it).second
んbmp
が、deleterにいるため、weak_ptrをロックすることもできません。弱いポインターと生のポインターの両方を維持する以外に、本当に他の選択肢はありませんか?
c++11 - std :: weak_ptrはいつ役に立ちますか?
私はC++11のスマートポインタの研究を始めましたが、の有用な使用法は見当たりませんstd::weak_ptr
。std::weak_ptr
誰かがいつ役に立つ/必要か教えてもらえますか?
c++ - 平等-std::weak_ptrと比較
2つのstd::weak_ptrまたは1つのstd::weak_ptrと1つのstd::shared_ptrを比較して同等性を確認します。
私が知りたいのは、weak_ptr/shared_ptrのそれぞれが指すオブジェクトが同じであるかどうかです。アドレスが一致しない場合だけでなく、基になるオブジェクトが削除されてから偶然同じアドレスで再構築された場合も、比較によって否定的な結果が得られるはずです。
したがって、基本的に、アロケータが同じアドレスを予約している場合でも、このアサーションを保持する必要があります。
weak_ptrテンプレートは等式演算子を提供しません、そして私が理解したように、それは正当な理由です。
したがって、単純な実装は次のようになります。
その間に最初のweak_ptrが期限切れになった場合、0になります。そうでない場合は、weak_ptrをshared_ptrにアップグレードし、アドレスを比較します。
これに伴う問題は、weak_ptrを2回(1回)ロックする必要があることです!時間がかかりすぎるのではないかと思います。
私はこれを思いついた:
これは、uの所有者ブロックがtの「前」ではなく、tがuの前ではないかどうかをチェックするため、t==uです。
これは私が意図したとおりに機能しますか?別個のshared_ptrから作成された2つのweak_ptrは、常にこのように等しくないものとして比較されますか?それとも私は何かを逃しましたか?
編集:なぜ私はそもそもこれをしたいのですか?共有ポインターを含むコンテナーが必要であり、その中のオブジェクトへの参照を配布したいと思います。イテレータは無効になっている可能性があるため、使用できません。(整数の)IDを配布することはできますが、それは一意性の問題につながり、マップタイプが必要になり、検索/挿入/削除操作が複雑になります。アイデアは、std :: setを使用し、ポインター自体(ラッパークラスにカプセル化されている)をキーとして提供することです。これにより、クライアントはweak_ptrを使用してセット内のオブジェクトにアクセスできます。
c++ - shared_ptrおよび循環参照
私はの循環参照を試していて、boost::shared_ptr
次のサンプルを考案しました。
どの出力
で述べた循環参照を誤解したのboost::shared_ptr
でしょうか?p1
なぜなら、アフターコメント1)
とへの間接参照については、異なる出力思考を期待していたから2)
です。したがって、このコードは必要ありませんboost::weak_ptr
!weak_ptr
では、 sが必要となる循環参照は何ですか?
前もって感謝します。
c++ - std::weak_ptr をキーとして std::map を使用するにはどうすればよいですか?
次のコードに示すように、std::weak_ptr
a のキーとしてどのように使用できますか?std::map
上記のプログラムはビルドされず、コンパイルしようとすると、次のような多くのエラー メッセージが表示されます。
この問題は、次の行が原因で発生します。
エラー メッセージは に関連しているようですoperator<
。を定義する必要がありますoperator<
かweak_ptr
? 正確には、データ型を ? のキーとして使用するには、どの演算子を定義する必要がありstd::map
ますか?
operator==
(名前空間で既に定義していることに注意してください。また、 ではなくカスタム クラス型にstd
を使用する予定です。)weak_ptr
int
c++ - weak_ptr のベクトルを持ち、shared_ptr のベクトルを返したい
現在、大きなプロジェクトに取り組んでおり、weak_ptr
代わりにを使用する必要がありshared_ptr
ます。
これが私の問題です。
属性を持つ House という名前のクラスがあります: vector<boost::shared_ptr<People>> my_people
。このデータ メンバーを に変更しますvector<boost::weak_ptr<People>> my_people
。
私のゲッターは
通常、単純なweak_ptr
I で戻ることができますmy_people.lock();
しかし、私はベクトルを持っていますが、次のようなことをする方法がわかりません:
weak_ptr
言い換えれば、 のベクトルを のベクトルとして返したいのshared_ptr
です。出来ますか?または、ベクトルを返して、weak_ptr
使用するすべてのlock()
場所で使用する必要がありますか?
c++ - 有効なオブジェクトを指しているかどうかをテストするためだけにweak_ptr.lock()を使用する必要がありますか?
weak_ptrが有効なオブジェクトを指しているかどうかを確認するためだけに、一時的なshared_ptrを作成する必要があるのは非効率的なようです。オブジェクトにもアクセスしたくありません。これは、shared_ptrのベクトルからweak_ptrを返す関数があり、それが空のweak_ptrを返す場合、そのオブジェクトがそのGUIDでまだ存在していないことを意味するためです。
だから私はオブジェクトが存在するかどうかをテストしているだけです。
shared_ptrを作成せずに、weak_ptrが空であるかどうかを確認する別の方法はありますか?