タグ付けされた質問 「shared-ptr」

参照は共有所有権を実装するスマートポインタークラスをカウントしました


4
shared_ptr <Derived>をshared_ptr <Base>として渡す
shared_ptr派生型shared_ptrのaを基本型のaを取る関数に渡すための最良の方法は何ですか? shared_ptr不必要なコピーを避けるために、私は通常、参照によってsを渡します。 int foo(const shared_ptr&lt;bar&gt;&amp; ptr); しかし、私が次のようなことをしようとすると、これは機能しません int foo(const shared_ptr&lt;Base&gt;&amp; ptr); ... shared_ptr&lt;Derived&gt; bar = make_shared&lt;Derived&gt;(); foo(bar); 使用できます foo(dynamic_pointer_cast&lt;Base, Derived&gt;(bar)); しかし、これは2つの理由で最適ではないようです。 Aはdynamic_cast、単純なため、過剰なビットが得ツーベースキャストようです。 私が理解しているdynamic_pointer_castように、関数に渡すポインターのコピー(一時的なものではありますが)を作成します。 より良い解決策はありますか? 後世のための更新: ヘッダーファイルがないという問題であることが判明しました。また、ここで私がやろうとしていたことは、アンチパターンと見なされます。一般的に、 オブジェクトの存続期間に影響を与えない(つまり、オブジェクトが関数の期間中有効である)関数は、単純な参照またはポインターを使用する必要がありますint foo(bar&amp; b)。 オブジェクトを消費する関数(つまり、特定のオブジェクトの最終ユーザー)は、unique_ptrby値を取る必要がありますint foo(unique_ptr&lt;bar&gt; b)。呼び出し元はstd::move、関数に値を入力する必要があります。 オブジェクトの存続期間を延長する関数はshared_ptr、値をとる必要がありますint foo(shared_ptr&lt;bar&gt; b)。循環参照を避けるための通常のアドバイスが適用されます。 詳細については、ハーブサッターの「基本に立ち返る」の話を参照してください。

5
共有ポインタを引数として渡す
共有ポインタでラップされたオブジェクトを宣言すると、次のようになります。 std::shared_ptr&lt;myClass&gt; myClassObject(new myClass()); それから私はそれをメソッドへの引数として渡したいと思いました: DoSomething(myClassObject); //the called method void DoSomething(std::shared_ptr&lt;myClass&gt; arg1) { arg1-&gt;someField = 4; } 上記は単にshared_ptの参照カウントをインクリメントするだけで、すべてがクールですか?それとも、ダングリングポインタを残しますか? あなたはまだこれをすることになっていますか?: DoSomething(myClassObject.Get()); void DoSomething(std::shared_ptr&lt;myClass&gt;* arg1) { (*arg1)-&gt;someField = 4; } (スマートポインタ全体ではなく)1つのアドレスをコピーするだけでよいため、2番目の方法の方が効率的かもしれないと思いますが、1番目の方法の方が読みやすく、パフォーマンスの制限を押し上げることはないと思います。危険なものがないことを確認したいだけです。 ありがとうございました。

7
shared_ptrを使用する例?
こんにちは私は今日、同じベクトル配列に異なるタイプのオブジェクトを挿入する方法について質問しました、そしてその質問の私のコードは gate* G[1000]; G[0] = new ANDgate() ; G[1] = new ORgate; //gate is a class inherited by ANDgate and ORgate classes class gate { ..... ...... virtual void Run() { //A virtual function } }; class ANDgate :public gate {..... ....... void Run() { //AND version of Run } …

2
C ++の空のstd :: shared_ptrとnullのstd :: shared_ptrの違いは何ですか?
cplusplus.comのshared_ptrページはの区別声をかけ、空 std::shared_ptrとヌルを shared_ptr。cppreference.comページには、明示的に両方の「空」との比較を区別を呼び出しますが、使用していないnullptrのその説明にstd::shared_ptr行動。 空とnullの間に違いはありますshared_ptrか?このような混合動作ポインタのユースケースはありますか?空でないnullshared_ptrは意味がありますか?通常の使用法(つまり、明示的に作成しなかった場合)で、空であるがnullではない結果になる可能性がある場合はありますshared_ptrか? また、C ++ 11バージョンの代わりにBoostバージョンを使用している場合、これらの回答のいずれかが変わりますか?
80 c++  c++11  shared-ptr 

3
shared_ptrのdeleterは、カスタムアロケーターによって割り当てられたメモリに格納されていますか?
私が持っていると言うshared_ptrカスタムアロケータでとカスタム削除手段。 削除プログラムを保存する場所について話している標準では何も見つかりません。カスタムアロケータが削除プログラムのメモリに使用されることはなく、そうでないこともありません。 これは指定されていませんか、それとも何か不足していますか?

1
このスレッドサニツァー警告のレースはどこですか?
以下のコードは、macOSでスレッドサニタイザーを使用して実行すると警告を生成します。レースの場所がわかりません。shared_ptrおよびweak_ptrの制御ブロックはスレッドセーフであり、からのプッシュとポップstd::queueはロックを保持したまま行われます。 #include &lt;future&gt; #include &lt;memory&gt; #include &lt;queue&gt; class Foo { public: Foo() { fut = std::async(std::launch::async, [this] { while (!shouldStop) { std::scoped_lock lock(mut); while (!requests.empty()) { std::weak_ptr&lt;float&gt; requestData = requests.front(); requests.pop(); (void)requestData; } } }); } ~Foo() { shouldStop.store(true); fut.get(); } void add(const std::weak_ptr&lt;float&gt; subscriber) { std::scoped_lock lock(mut); requests.push(subscriber); } …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.