問題タブ [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++ - C++ の clone() の最良の署名は何ですか?
Scott Myers が書いたように、C++ の型システムの緩和を利用して clone() を宣言し、宣言されている実際の型へのポインターを返すことができます。
コンパイラは、clone() がオブジェクトの型へのポインターを返すことを検出し、Derived がそれをオーバーライドして、派生へのポインターを返すことを許可します。
次のように、所有権のセマンティクスの転送を意味するスマート ポインターを clone() が返すようにすることが望ましいでしょう。
残念ながら、規則の緩和はテンプレート化されたスマート ポインターには適用されず、コンパイラーはオーバーライドを許可しません。
したがって、次の 2 つのオプションが残っているようです。
- clone() に「ダム」ポインターを返させ、クライアントがそれを破棄する責任があることを文書化します。
- clone() がスマート ベース ポインターを返すようにし、必要に応じてクライアントが dynamic_cast を使用して派生ポインターに保存するようにします。
これらのアプローチのいずれかが優先されますか? または、所有権のセマンティクスの譲渡を食べて、強力な型の安全性も確保する方法はありますか?
c++ - .アクセス違反読み取り箇所
私は本当に奇妙な問題に遭遇しました。
コードは次のとおりです。
次の例外を受け取りました。
を確認しましたがpImage
、 がいつgraphics.DrawImage
呼び出されるかは確かですNULL
。
- なぜそのような問題が起こったのですか?
- とは
0xfeeefef2
?
c++ - VC++ 8 で auto_ptr を置き換える
std::auto_ptr
VC++ 8 では壊れています (これは私たちが仕事で使用しているものです)。それに対する私の主な不満は、それが可能auto_ptr<T> x = new T();
であることです。これはもちろん恐ろしいクラッシュにつながりますが、誤って行うのは簡単です。
stackoverflow に関する別の質問への回答から:
Visual Studio 2005 での std::auto_ptr の実装はひどく壊れていることに注意してください。 http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=98871 http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=101842
使いたい
boost::scoped_ptr
、所有権を渡してはならないポインタ用。boost::shared_ptr
、コンテナー内のポインターおよびポインターが必要な他の場所。std::auto_ptr
、所有権を渡す必要がある/渡すことができるポインター用。
しかし、std::auto_ptr
私にとっては壊れているので、最善のアプローチは何でしょうか:
std::auto_ptr
ネットで拾ったもので代用。Rani Sharoni のこのようなもの(まだ試していません)。boost::shared_ptr
代わりに使用してください。もちろん機能しますが、私が気にしない小さなオーバーヘッドが発生します。auto_ptr
しかし、ポインターの意図を知らせるために使用したいと思います。(このアプローチに関する投票については、この回答を参照してください。)- 実際には所有権を渡す必要はないので、これについて心配する必要はありません。
更新: これが私がしたことです: Rani Sharoni による前述の auto_ptr 実装をコピーしました。ここから。
いくつかのマイナーなテストを行いました:
もちろん、これらのテストは決して網羅的なものではなく、信頼すべきではありません。例外セーフのテンプレート クラスを実装することは、毛むくじゃらの仕事です。少なくとも、これは組み込みのものよりもうまく機能します。
注: 著作権に関して、この実装をまだ使用できるかどうかはわかりません。Rani にメールを送信し、返信を待っています。詳細がわかり次第、この投稿を更新します。
誰でも、Rani Sharoni の auto_ptr 実装を自由に使用することが許可されています。
返信ありがとうございます。
c++ - C++ スマート ポインターのパフォーマンス
スマート ポインター、特に boost::shared_ptr を使用すると、時間とメモリの点でベア ポインターと比較してどのくらいコストがかかりますか? ゲーム/組み込みシステムのパフォーマンスを重視する部分では、ベア ポインターを使用する方が良いですか? パフォーマンスを重視するコンポーネントには、ベア ポインターとスマート ポインターのどちらを使用することをお勧めしますか?
c++ - BSTR と _bstr_t の違いは何ですか?
上記のタイプの違いと、2つの違いを明確に説明するためのサンプル使用法を説明できる人はいますか?
どんな助けでも大歓迎です!注:この質問は、この他の質問からのスピンオフです
c++ - スマートポインタ+「これ」は有害と見なされますか?
などのスマート ポインターを使用する C++ プロジェクトでboost::shared_ptr
、" " の使用に関する優れた設計哲学は何this
ですか?
次のことを考慮してください。
スマート ポインターに含まれる生のポインターを後で使用するために保存するのは危険です。オブジェクトの削除の制御をあきらめ、スマート ポインターが適切なタイミングでそれを実行することを信頼します。
非静的クラス メンバーは、本質的に
this
ポインターを使用します。これは生のポインターであり、変更することはできません。
別の変数に保存this
したり、後で保存したり、コールバックでバインドしたりする可能性のある別の関数に渡すと、誰かがクラスへの共有ポインターを作成することを決定したときに導入されるバグが作成されます。
this
それを考えると、ポインタを明示的に使用することが適切なのはいつですか? これに関連するバグを防ぐことができる設計パラダイムはありますか?
c++ - Windows Mobile 6 SDK のスマート ポインター
WinCE の STL は Microsoft の別のチームによって維持されているため、WinMobile プロジェクトの std::tr1::shared_ptr を取得できません :( aarrgh...
別のスレッドセーフな参照カウント スマート ポインターを使用した人はいますか? 私は実際に良いと思われるyasperを使用しています。
どうもありがとうございました。
c++ - C で書かれたライブラリを使用したスマート ポインター
この質問には関係ありませんが、画像処理ライブラリである OpenCV ライブラリで C++ を使用しています。現在、私はデザインの決定を下しています。
C ライブラリである OpenCV には、そのデータ構造 (CvMat など) が構造体として宣言されています。作成するには cvCreateMat などの関数を使用し、解放するには cvReleaseMat などの関数を使用します。C++ プログラマーとして、cv_scoped
スコープ外になったときに cvReleaseMat を自動的に呼び出す特別なクラスを作成しました ( のようにboost::scoped_ptr
)。
私が今気付いているのは、ケースでも使用できればいいのにということauto_ptr
ですshared_ptr
。時間の無駄は言うまでもなく、自分自身cv_auto_ptr
とcv_shared_ptr
クラスのコードを書くのは悪い考えだと思います。それで解決策を探していて、3つの可能性を思いつきました。
まず、作成済みの cv_scoped クラスを使用できます。名前を に変更してからcv_ptr
、次のようなスマート ポインターを使用しますstd::auto_ptr<cv_ptr>
。ただし、これに関する厄介なことは、常に 2 回逆参照する必要があることです。
暗黙的な変換を宣言できるように見えることはわかっていますが、実際にはできませんでした.OpenCVの関数のほとんどにはパラメータ void* があるため、暗黙的な変換は呼び出されません. 二重逆参照を行う必要のない方法でこれを行う方法が本当に欲しいです。
第二に、どうにかしてオーバーライドすることができoperator delete
ました。これを CvMat (および他のいくつかの) 型に適用したいだけなので、グローバル演算子 delete をオーバーライドしたくありません。ただし、ライブラリを変更できないoperator delete
ため、CvMat 構造体に追加できません。したがって、これがどのように機能するかはわかりません。
第三に、自分のauto_ptr
, scoped_ptr
, and を書き直すことができましたshared_ptr
。大規模なクラスではないので、それほど難しくはありませんが、これは設計が悪いと感じています。私がこれを行うとしたら、おそらく次のようなことをするでしょう。
私の状況であなたはどうしますか?これを理解するのを手伝ってください。