タグ付けされた質問 「smart-pointers」

自動ガベージコレクションや境界チェックなどの追加機能を提供しながらポインターをシミュレートする抽象データ型


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)。循環参照を避けるための通常のアドバイスが適用されます。 詳細については、ハーブサッターの「基本に立ち返る」の話を参照してください。

2
参照または値によってスマートポインター(shared_ptr)を返す方法は?
を返すメソッドを持つクラスがあるとしますshared_ptr。 参照または値によってそれを返すことの考えられる利点と欠点は何ですか? 2つの考えられる手がかり: オブジェクトの早期破壊。shared_ptrby(const)参照を返す場合、参照カウンターは増分されないため、別のコンテキスト(たとえば、別のスレッド)でスコープから外れると、オブジェクトが削除されるリスクがあります。これは正しいです?環境がシングルスレッドの場合、この状況も発生する可能性がありますか? 費用。値渡しは確かに無料ではありません。可能な限り回避する価値はありますか? みんなありがとう。


3
shared_ptrマジック:)
リドストローム氏と私は議論をしました:) Lidström氏の主張は、構成shared_ptr&lt;Base&gt; p(new Derived);はBaseに仮想デストラクタを必要としないというものです。 Armen Tsirunyan:「本当に?shared_ptrは正しくクリーンアップされますか?この場合、その効果をどのように実装できるかを示していただけませんか?」 DanielLidström:「shared_ptrは独自のデストラクタを使用してConcreteインスタンスを削除します。これはC ++コミュニティではRAIIと呼ばれます。RAIIについてできる限りのことを学ぶことをお勧めします。これにより、C ++コーディングが非常に簡単になります。あらゆる状況でのRAII。」 Armen Tsirunyan:「RAIIについて知っています。また、pnが0に達すると、最終的にshared_ptrデストラクタが保存されたpxを削除する可能性があることも知っています。しかし、pxに静的型ポインタBaseと動的型ポインタがあるDerived場合Base、仮想デストラクタがない限り、これは未定義の動作になります。間違っている場合は修正してください。」 DanielLidström:「shared_ptrは静的型がConcreteであることを知っています。コンストラクターに渡したので、これを知っています。魔法のように見えますが、設計によるものであり、非常に優れていると確信できます。」 だから、私たちを判断してください。ポリモーフィッククラスに仮想デストラクタを持たせることなく、shared_ptrを実装することはどのように可能ですか?前もって感謝します

5
std :: shared_ptrに相当する非アトミックなものはありますか?そして、なぜ<memory>にないのですか?
これは、次の原子性に関する2つの部分からなる質問ですstd::shared_ptr。 1. 私が知る限り、それはアトミックstd::shared_ptrな唯一のスマートポインター&lt;memory&gt;です。std::shared_ptr利用可能な非アトミックバージョンがあるかどうか疑問に思っています(何も表示されない&lt;memory&gt;ので、Boostのような標準外の提案も受け付けています)。boost::shared_ptrアトミックでもあることは知っていますが(BOOST_SP_DISABLE_THREADS定義されていない場合)、別の選択肢があるのでしょうか?と同じセマンティクスを持つstd::shared_ptrが、原子性がないものを探しています。 2.なぜstd::shared_ptrアトミックなのか理解しています。ちょっといいです。ただし、すべての状況に適しているわけではなく、C ++には、歴史的に「使用した分だけ支払う」というマントラがありました。複数のスレッドを使用していない場合、または複数のスレッドを使用しているがスレッド間でポインターの所有権を共有していない場合、アトミックスマートポインターはやり過ぎです。私の2番目の質問は、なぜ非アトミックバージョンのstd::shared_ptrがC ++ 11で提供されなかったのかということです。(理由があると仮定して)(答えが単に「非アトミックバージョンは単に考慮されなかった」または「誰も非アトミックバージョンを要求したことがない」である場合は問題ありません!) 質問#2で、誰かがshared_ptr(Boostまたは標準化委員会のいずれかに)の非アトミックバージョンを提案したことがあるかどうか疑問に思っています(のアトミックバージョンを置き換えるのでshared_ptrはなく、それと共存するために)そしてそれは特定の理由。


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
weak_ptrのリセットはshared_ptrに影響しますか?
私は使用にあまり慣れておらずweak_ptr、かなり混乱する状況に直面しています。Intel XE 2019 Composer update 5(パッケージ2019.5.281)をVisual Studio 2019 ver。と組み合わせて使用しています。16.2.5。64ビットでコンパイルします。標準のC ++ 17を使用しています。 これが私のスパイクソリューションのコードです。 #include &lt;memory&gt; #include &lt;iostream&gt; using namespace std; int main( int argc, char* argv[] ) { shared_ptr&lt;int&gt; sp = make_shared&lt;int&gt;( 42 ); cout &lt;&lt; "*sp = " &lt;&lt; *sp &lt;&lt; endl; weak_ptr&lt;int&gt; wp = sp; cout &lt;&lt; "*sp = …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.