問題タブ [smart-pointers]
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::copy_on_write_ptr がないのはなぜですか?
この素敵なコピー オン ライト ポインターの実装を見たところです。それは非常に一般的で便利に見えるので、私の質問は次のとおりです。そのようなクラスは C++ ツールキット (boost、loki など) のいずれかに含まれていますか? そうでない場合、それは本当に便利なイディオムであり、明らかに一般的な実装が実行可能であるように見えるため、その理由を本当に知りたいです(私がリンクしたもののように)。
c++ - なぜweak_ptrは循環参照を壊すことができるのですか?
循環参照を壊すためにshare_ptrと連携するweak_ptrについて多くのことを学びました。それはどのように機能しますか?それをどのように使用しますか?どんな体でも私に例をあげることができますか?私はここで完全に迷子になっています。
もう1つの質問、強力な指針は何ですか?
c++ - 参照がなくなったときにキャッシュからスマートポインタを削除するにはどうすればよいですか?
私は既存のアプリをアップグレードするためにスマートポインターを使用しようとしてきました、そして私はパズルを克服しようとしています。私のアプリにはオブジェクトのキャッシュがあります。たとえば、それらを本と呼びましょう。これで、この本のキャッシュはIDによって要求され、キャッシュ内にある場合は返されます。そうでない場合は、オブジェクトが外部システムから要求され(低速操作)、キャッシュに追加されます。キャッシュに入ると、アプリで多くのウィンドウを開くことができ、これらの各ウィンドウは本への参照を取得できます。以前のバージョンのアプリでは、プログラマーはAddRefとReleaseを維持する必要があり、Bookオブジェクトを使用するすべてのウィンドウが閉じられると、(キャッシュマネージャー上の)最終リリースでオブジェクトがキャッシュから削除され、オブジェクトが削除されました。
ここでチェーンの弱いリンクを見つけたかもしれません。もちろん、プログラマーはAddRefとReleaseを呼び出すことを覚えています。これで、スマートポインター(boost :: intrusive)に移動しました。AddRefとReleaseの呼び出しについて心配する必要はありません。ただし、これは問題につながります。キャッシュにはオブジェクトへの参照があるため、最後のウィンドウを閉じても、他の誰も参照を保持していないことがキャッシュに通知されません。
私の最初の考えは、定期的にキャッシュをウォークし、参照カウントが1のオブジェクトをパージすることでした。これはオーダーNの操作であり、気分が悪いため、私はこのアイデアが気に入らなかった。私はコールバックシステムを思いついた。それはより良いが素晴らしいものではない。コールバックシステムのコードを含めましたが、誰かがこれを行うためのより良い方法があるかどうか疑問に思っていましたか?
乾杯リッチ
c++ - auto_ptr は非推奨ですか?
- 次の C++ 標準で auto_ptr は廃止されますか?
- 所有権の譲渡には、shared_ptr の代わりに unique_ptr を使用する必要がありますか?
- unique_ptr が標準にない場合、代わりに shared_ptr を使用する必要がありますか?
c++ - ユーザーが通常のptrではなくshared_ptrを使用するようにする正しい方法は何ですか?
私のクラスでは、コンストラクターはプライベートであり、コンストラクターを使用してその share_ptr を返す静的メソッド「CreateMyClassPtr」を追加しました。
それは正しい実装ですか?
それが使用されることを確認する必要さえあると思いますshared_ptr
か?決定するのはユーザーに任せるべきでしょうか?
c++ - DB接続ポインタオブジェクトを参照カウントポインタとして実装するのはなぜですか? (C++)
弊社ではC++のコアクラスの一つ(データベース接続ポインタ)を参照カウントポインタとして実装しています。明確にするために、オブジェクトは DB 接続自体ではなく、DB 接続オブジェクトへのポインターです。
ライブラリは非常に古く、設計者はもう誰もいません。
これまでのところ、私も、私が尋ねた会社の C++ 専門家も、この特定の設計が選択された理由について十分な理由を見つけていません。何か案は?
いくつかの問題が発生しています (部分的には、使用されているひどい参照ポインターの実装が原因です)。この設計に実際に深い根本的な理由があるかどうかを理解しようとしていますか?
最近の使用パターンは、DB 接続マネージャー クラスによって DB 接続ポインター オブジェクトが返されるようで、DB 接続ポインターが DB 接続マネージャーとは独立して使用できるように設計されているかどうかは不明です。
c++ - 関数への参照によって auto_ptr を渡すことはできますか?
次の機能はOKです:
c++ - 参照を使用し、ヘッダーの肥大化を回避し、初期化を遅らせる方法は?
非常に多くのshared_ptrsを使用する代わりの方法を探していたところ、コメントセクションで優れた返信が見つかりました。
本当に共有所有権が必要ですか?立ち止まって数分間考えれば、オブジェクトの1人の所有者とそのユーザーの数を正確に特定でき、所有者の存続期間中にのみ使用されると確信しています。したがって、それを所有者のローカル/メンバーオブジェクトにし、それを使用する必要がある人に参照を渡すだけです。
これを実行したいのですが、問題は、所有オブジェクトの定義で、最初に所有オブジェクトを完全に定義する必要があるということです。たとえば、FooManager.hに次のものがあるとします。
さて、上記のアドバイスを受けると、FooManager.hは次のようになります。
これには2つの問題があります。まず、FooManager.hは軽量ではなくなりました。これを含むすべてのcppファイルは、Foo.hもコンパイルする必要があります。次に、fooが初期化されるタイミングを選択できなくなりました。FooManagerと同時に初期化する必要があります。これらの問題を回避するにはどうすればよいですか?
c++ - BOOSTスマートポインタコードのみをプロジェクトに含めるにはどうすればよいですか?
プロジェクトにすべてのBoostライブラリを追加せずに、Boostスマートポインタライブラリのみを含めるためのベストプラクティスは何ですか?
プロジェクトでブーストスマートポインターライブラリのみが必要であり、そのためだけに200 MBのソースコード(ブースト1.42.0)をプロジェクトリポジトリにチェックイン/コミットしたくありません。さらに、私のWindows Mobileプロジェクト自体は、そのサイズの10%にも達していません。
c++ - 誰かがこれらのスマートポインター(auto_any、scoped_any、shared_any)を試乗しましたか?
VS 2008 tr1を使用できないWindowsCEおよびモバイル用の「共有」機能を備えたスマートポインターを調査してstd::shared_ptr
います(CEに存在しないv.9 dllへのリンクが原因で、正しく理解している場合は明らかです)。
Microsoftie(Eric Niebler)からのソースを含む半古いMSDN Magazineの記事があります:カスタムC++クラスでより信頼性の高いリソース管理を実現します。
彼の推論、設計、実装はshared_any
しっかりしているように見えますが、誰かが実際に任意のプラットフォーム(必ずしもWinCe / WMである必要はありません)でロットをテストしたことがあるかどうか疑問に思います。