問題タブ [shared-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 Shared Pointer:複数のスレッド間での同時読み取りアクセス
メモリを割り当てて共有ポインタに割り当てるスレッドAがあります。次に、このスレッドは他の3つのスレッドX、Y、Zを生成し、共有ポインターのコピーをそれぞれに渡します。X、Y、Zがスコープ外になると、メモリが解放されます。ただし、2つのスレッドX、Yがまったく同じ時点でスコープから外れ、参照カウントに競合状態があるため、2ずつデクリメントするのではなく、1回だけデクリメントされる可能性があります。そのため、新しい参照カウントが0に低下するため、メモリリークが発生します。X、Y、Zはメモリを読み取っているだけであることに注意してください。共有ポインタを書き込んだりリセットしたりしない。長い話を短くするために、参照カウントに競合状態があり、それがメモリリークにつながる可能性がありますか?
c++ - shared_ptrを返すときに共変の戻り値の型を達成する方法は?
戻り値の型は共変ではありません (したがって、合法でもありません) が、代わりに生のポインターを使用していた場合は共変になります。もしあれば、これを回避するために一般的に受け入れられているイディオムは何ですか?
c++ - 誰かが私の shared_ptr を盗むのを防ぐには?
したがって、私は boost::shared_ptr を使用して、それが提供するさまざまな参照カウントの利点をすべて提供します。初心者向けの参照カウントはもちろんですが、コピー、割り当て、および STL コンテナーへの保存も可能です。
問題は、それを 1 つの「悪意のある」関数またはオブジェクトに渡すと、そのオブジェクトが ptr を保存できるため、外部関数またはオブジェクトがその所有権を適切に放棄しない限り、その割り当てを解除できないことです。
最終的に、私はオブジェクトの所有権を明示的に保つようにしています。これを実現するには、所有者にオブジェクトへの shared_ptr のみを保持させ、「ゲスト」オブジェクトはそのオブジェクトへの weak_ptr のみを保存します。
私は本当にshared_ptrの「共有」部分を望んでいませんが、weak_ptrsを作成するにはshared_ptrを使用する必要があります。scoped_ptrを使いたいのですが、コピーできないので非常に限られています。コンテナーに格納することも、weak_ptrs を貸し出すことも、新しいマネージャーに所有権を譲渡することもできません。
解決策は何ですか?
c++ - shared_ptrs の使用中に参照を返す
かなり大きな classがあり、次のように等価性をチェックするためにMatrix
オーバーロードしたとします。operator==
もちろん、Matrix オブジェクトは非常に大きいため、参照渡ししています。
Matrix::inverse()
これで、新しい Matrix オブジェクトを返すメソッドができました。ここで、次のように、比較で逆を直接使用したいと思います。
問題は、逆メソッドが Matrix オブジェクトへの参照を返す必要があることです。2 つの質問:
この1回の比較でその参照を使用しているだけなので、これはメモリリークですか?
inverse() メソッドで返されるオブジェクトが boost::shared_ptr に属している場合はどうなりますか? メソッドが終了するとすぐに、shared_ptr が破棄され、オブジェクトは無効になります。shared_ptr に属するオブジェクトへの参照を返す方法はありますか?
c++ - shared_ptr を typedef するための規則は何ですか?
テンプレートをtypedef
'ing' するための命名規則を切り替えています。boost::shared_ptr
例えば:
規約を決める前に、他の人が何を使っているか見てみたい。あなたのコンベンションは何ですか?
編集:
typedef
内部をネストしている人は、それがどのように渡されるかを「認識」しているFoo
ことが気になりませんか? Foo
カプセル化を破るようです。これはどう:
あなたは今これをしないでしょうね?:-)
c++ - shared_ptrを使用したメモリリーク
どちらのコード例も問題なくコンパイルおよび実行されます。2番目のバリアントを使用すると、メモリリークが発生します。なぜ何かアイデアはありますか?助けてくれてありがとう。
バリアント1:
バリアント2:
c++ - boost/tr1 shared_ptr のブーストに依存しないバージョンはありますか
shared_ptr
boost/tr1との独立した実装を探してい weak_ptr
ますenable_shared_from_this
。
私は欲しい:
- これらの機能の独立した非常に小さな実装を後押しします。
- MSVC6 や gcc-3.3 などではなく、GCC-4.x、MSVC-2008、Intel などの最新のコンパイラのみのサポートが必要です。
- Boost/Mit/3-clause BSD のような非コピーレフト LGPL 互換ライセンスの下でライセンスされる必要があります。
だから私はそれを私のライブラリに含めることができます。
注-ブーストからshared_ptrを抽出するのは非常に困難です。少なくともBCPは約324ファイルを提供します...
c++ - boost::shared_ptr (または別のスマート ポインター) をオブジェクトの親の参照カウンターにアタッチする方法は?
以前にこの概念に遭遇したことを覚えていますが、今は Google で見つけることができません。
タイプ B のオブジェクトを直接埋め込むタイプ A のオブジェクトがある場合:
B
たとえば、へのスマート ポインターを取得するにはどうすればよいですか?boost::shared_ptr<B>
の参照カウントを使用しますA
か? A
それ自体のインスタンスがヒープに割り当てられていると仮定すると、たとえばenable_shared_from_this
.
c++ - shared_ptrのコンテナをキャストする
方法があります
これは、DerivedClass1とDerivedClass2の2種類のリストで呼び出そうとしています。
ただし、これは明らかにコンパイラエラーを生成します
shared_ptrのコンテナをキャストする簡単な方法はありますか?これを達成できる代替コンテナの?
更新:回答してくれたすべての人に感謝します。言語の範囲内で作業する場合、メソッドを「現状のまま」維持しながら、shared_ptrのコンテナーを使用し、それを正確に渡す(呼び出しサイトで新しいリストを作成する)のが最善の方法のようです。
私はすでにこれを知っていると思いますが、shared_ptrのコンテナーを処理するBoostライブラリの他の部分について読んだことを思い出し、おそらく他の誰かによってもっとエレガントに解決されたのではないかと思いました。しかし、私自身のさらなる調査から、これらは、多数のポインターが排他的に所有されている場合のshared_ptrのオーバーヘッドの削減に向けられているようです(したがって、コンテナー内のオブジェクトごとに1つではなく、コンテナーごとに1つのロックが必要です)。
もう一度ありがとう、皆さんはすべて素晴らしいです!
c++ - クラスメンバーとしての shared_ptr
含まれているオブジェクトをそのクラスへのポインターとして宣言し、ヘッダーファイルでそれらを「前方宣言」するのが一般的です。これは、コード内の物理的な依存関係を減らすためです。
例えば
そのようなメンバーをネイキッド ポインターではなく、shared_ptr として宣言するのは良い考えでしょうか?
私はscoped_ptrを好むでしょうが、それは標準ではありません。