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

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


8
C ++でのmake_sharedと通常のshared_ptrの違い
std::shared_ptr<Object> p1 = std::make_shared<Object>("foo"); std::shared_ptr<Object> p2(new Object("foo")); 多くのグーグルとスタックオーバーフローの投稿がこれにありますがmake_shared、直接使用するよりもなぜ効率的であるのか理解できませんshared_ptr。 誰かが私にどのようmake_sharedに効率的であるかを理解できるように、作成されたオブジェクトのシーケンスと両方で行われた操作を順を追って説明してくれませんか?参考のために、上記の例を1つ示しました。
276 c++  c++11  shared-ptr 

10
shared_ptrを参照または値のどちらで渡す必要がありますか?
関数がshared_ptr(boostまたはC ++ 11 STLから)取るとき、それを渡しますか? const参照: void foo(const shared_ptr<T>& p) または値によって: void foo(shared_ptr<T> p)? 最初の方法の方が速いのではないかと思います。しかし、これは本当に価値があるのですか、それとも他に問題がありますか? あなたが選択した理由を教えてください、または場合は、それが問題ではないと思う理由。
270 c++  c++11  boost  shared-ptr 


16
保護されたコンストラクターまたはプライベートコンストラクターのみを含むクラスで:: std :: make_sharedを呼び出すにはどうすればよいですか?
動作しないこのコードがありますが、その意図は明らかだと思います: testmakeshared.cpp #include <memory> class A { public: static ::std::shared_ptr<A> create() { return ::std::make_shared<A>(); } protected: A() {} A(const A &) = delete; const A &operator =(const A &) = delete; }; ::std::shared_ptr<A> foo() { return A::create(); } しかし、コンパイルするとこのエラーが発生します。 g++ -std=c++0x -march=native -mtune=native -O3 -Wall testmakeshared.cpp In file included from …
187 c++  c++11  shared-ptr 

2
配列へのshared_ptr:使用する必要がありますか?
に関する小さなクエリshared_ptr。 shared_ptr配列を指すことを使用するのは良い習慣ですか?例えば、 shared_ptr<int> sp(new int[10]); そうでない場合、なぜそうではないのですか?私がすでに認識している理由の1つは、を増減できないことshared_ptrです。したがって、配列への通常のポインタのように使用することはできません。
172 c++  c++11  shared-ptr 

2
クラスメンバーのスマートポインターの使用
C ++ 11のクラスメンバーとしてのスマートポインターの使用法を理解できません。私はスマートポインターについて多くを読みましたが、私はどのようにunique_ptr、およびshared_ptr/またはweak_ptr一般的に機能するかを理解していると思います。わからないのは本当の使い方です。誰もunique_ptrがほとんどいつも行く方法として使うことを勧めているようです。しかし、私はこのようなものをどのように実装しますか: class Device { }; class Settings { Device *device; public: Settings(Device *device) { this->device = device; } Device *getDevice() { return device; } }; int main() { Device *device = new Device(); Settings settings(device); // ... Device *myDevice = settings.getDevice(); // do something with myDevice... } ポインタをスマートポインタに置き換えたいとしましょう。のunique_ptrためにA …

6
なぜstd :: move an std :: shared_ptrなのでしょうか?
私はClangソースコードを調べていましたが、次のスニペットを見つけました。 void CompilerInstance::setInvocation( std::shared_ptr<CompilerInvocation> Value) { Invocation = std::move(Value); } なぜ私がしたいでしょうか?std::movestd::shared_ptr 共有リソースの所有権を譲渡するポイントはありますか? なぜ私は代わりにこれをしないのですか? void CompilerInstance::setInvocation( std::shared_ptr<CompilerInvocation> Value) { Invocation = Value; }

6
std :: shared_ptr <void>が機能する理由
シャットダウン時にstd :: shared_ptrを使用して任意のクリーンアップを実行するコードを見つけました。最初はこのコードは機能しないと思っていましたが、次のことを試しました。 #include &lt;memory&gt; #include &lt;iostream&gt; #include &lt;vector&gt; class test { public: test() { std::cout &lt;&lt; "Test created" &lt;&lt; std::endl; } ~test() { std::cout &lt;&lt; "Test destroyed" &lt;&lt; std::endl; } }; int main() { std::cout &lt;&lt; "At begin of main.\ncreating std::vector&lt;std::shared_ptr&lt;void&gt;&gt;" &lt;&lt; std::endl; std::vector&lt;std::shared_ptr&lt;void&gt;&gt; v; { std::cout &lt;&lt; "Creating …
129 c++  c++11  shared-ptr 

17
C ++-std :: shared_ptrまたはboost :: shared_ptrに参照を渡す
で動作する必要がある関数がある場合shared_ptr、(shared_ptrオブジェクトのコピーを避けるために)関数への参照を渡す方が効率的ではないでしょうか?考えられる悪い副作用は何ですか?私は次の2つのケースを想定しています。 1)関数内では、次のように引数のコピーが作成されます ClassA::take_copy_of_sp(boost::shared_ptr&lt;foo&gt; &amp;sp) { ... m_sp_member=sp; //This will copy the object, incrementing refcount ... } 2)関数内では、引数は次のようにのみ使用されます Class::only_work_with_sp(boost::shared_ptr&lt;foo&gt; &amp;sp) //Again, no copy here { ... sp-&gt;do_something(); ... } どちらの場合も、参照ではなくboost::shared_ptr&lt;foo&gt;by値を渡す正当な理由がわかりません。値による受け渡しは、コピーのために「一時的に」参照カウントをインクリメントし、関数スコープを終了するときにそれをデクリメントします。私は何かを見落としているか? 明確にするために、いくつかの回答を読んだ後、私は時期尚早の最適化の懸念に完全に同意します。私の質問は、純粋に技術的なコードの観点からのものでした。

4
`const shared_ptr <T>`と `shared_ptr <const T>`の違いは何ですか?
次のようなC ++の共有ポインターのアクセサーメソッドを書いています。 class Foo { public: return_type getBar() const { return m_bar; } private: boost::shared_ptr&lt;Bar&gt; m_bar; } したがってgetBar()、戻り値の型のconst-nessをサポートするためにboost::shared_ptrは、Barそれが指す変更を防ぐ必要があります。私の推測では、それshared_ptr&lt;const Bar&gt;は私が戻りたいタイプですconst shared_ptr&lt;Bar&gt;が、ポインタ自体が別のものを指すように再割り当てすることはできませんが、それが指すBarものの変更は許可さBarれます...しかし、私にはわかりません。確実に知っている人がこれを確認するか、間違った場合は修正していただければ幸いです。ありがとう!
115 c++  boost  const  shared-ptr 

3
std :: shared_ptrスレッドセーフティの説明
私はhttp://gcc.gnu.org/onlinedocs/libstdc++/manual/shared_ptr.htmlを読んでいますが、いくつかのスレッドセーフティの問題はまだわかりません: 標準では、参照カウントがスレッドセーフで処理され、プラットフォームに依存しないことが保証されています。 同様の問題-標準では、1つのスレッド(最後の参照を保持している)のみが共有オブジェクトで削除を呼び出すことが保証されていますよね? shared_ptrは、それに格納されているオブジェクトのスレッドセーフを保証しませんか? 編集: 疑似コード: // Thread I shared_ptr&lt;A&gt; a (new A (1)); // Thread II shared_ptr&lt;A&gt; b (a); // Thread III shared_ptr&lt;A&gt; c (a); // Thread IV shared_ptr&lt;A&gt; d (a); d.reset (new A (10)); スレッドIVでreset()を呼び出すと、最初のスレッドで作成されたAクラスの以前のインスタンスが削除され、新しいインスタンスに置き換えられますか?さらに、IVスレッドでreset()を呼び出した後、他のスレッドには新しく作成されたオブジェクトのみが表示されますか?
106 c++  c++11  shared-ptr 

4
shared_ptrはどこにありますか?
shared_ptrがどこにあるのかを数時間探した後、私は今とてもイライラしています。私が目にする例はどれも、ヘッダーを含むshared_ptr(そして機能する)完全なコードを示していません。単に述べるだけstdでtr1、&lt;memory&gt;まったく役に立たない!ブーストをダウンロードしましたが、それでも表示されません!誰かがそれを見つける場所を正確に教えてくれますか? 欲求不満を解消させてくれてありがとう! 編集:タイトルが変更されたようです。申し訳ありません。つまり... shared_ptrが「C ++バージョンに依存する」ことは私には明確ではなかったためでもありました-&gt;私が環境について述べなかった理由-&gt;したがって、おそらく私がそれを見つけることが非常に困難であった理由。 MSVS2008に取り組んでいます。 編集2:理由はわかりませんが、[memory]と[boost / tr1 / memory.hpp]と[boost / tr1 / tr1 / memory]を含めて、どこからでもshared_ptrを探していました。もちろん、できませんでしたない すべての応答をありがとう。

2
これのstd :: shared_ptr
私は現在、スマートポインターの使用方法を学習しようとしています。しかし、いくつかの実験を行っているときに、満足のいく解決策を見つけることができない次の状況を発見しました。 クラスAのオブジェクトがクラスB(子)のオブジェクトの親であるとしますが、両方がお互いを知っている必要があります。 class A; class B; class A { public: void addChild(std::shared_ptr&lt;B&gt; child) { children-&gt;push_back(child); // How to do pass the pointer correctly? // child-&gt;setParent(this); // wrong // ^^^^ } private: std::list&lt;std::shared_ptr&lt;B&gt;&gt; children; }; class B { public: setParent(std::shared_ptr&lt;A&gt; parent) { this-&gt;parent = parent; }; private: std::shared_ptr&lt;A&gt; parent; }; 問題は、クラスAのオブジェクトstd::shared_ptrがそれ自体の(this)をその子にどのように渡すことができるかです。 …


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.