9

私は拡張画像処理プロジェクトを持っており、その機能の多くをOpenCVライブラリに大きく依存していますが、いくつかのブースト関数も使用しています。

問題を引き起こし始めているいくつかの生のポインターを置き換えるためにスマートポインターを使い始めたいと思います。私の質問は、どのタイプのスマートポインターを使用するかについてです。私の主な選択肢は、OpenCVcv::Ptrまたはブーストバリアントの1つです。

それぞれのブーストポインターの違いを説明する質問たくさんあることは承知していますが、誰かがそれらとの比較について説明し、どちらか一方の推奨事項を作成してくれることを望みました。cv::Ptr

編集-私はブーストに似ているOpenCVドキュメントから気づきました、本質的な違いはどのライブラリ/インクルードファイルが必要かだけですか?Ptrshared_ptr

4

1 に答える 1

7

私がOpenCVのドキュメントで見ることができるものについては、これは参照カウントされたスマートポインターであり、本質的にはと同じboost::shared_ptrです。それでも、参照カウントに対して不可分操作を使用します。

移植性と相互運用性に基づいて選択します。

  1. システムは他の場所に移植され、OpenCVに確実に依存しますが、依存しませんboostか?cv::Ptr次に、ブーストを回避でき、依存関係を取り除くことができる場合は、OpenCVに固執します。

  2. boost::shared_ptrOpenCVの残りの部分とうまく機能しますか?OpenCVライブラリからcv::Ptrを返すものがある場合は、これらの場合はcv :: Ptrに固執する方がよいでしょう。両方の種類のポインターを混在させると参照カウントが正しく処理されず、リソースが早期に破壊される可能性があるためです。 。

  3. boostプロジェクトを移植する場所に固執するつもりですか?次に、それができるときに固執しboost::shared_ptrます。それはより標準的であり、人々はそれを知っており、すぐにあなたのコードを理解します。更新:C ++ 11には、std :: shared_ptrがあります。これは、余裕があれば依存関係がないため、この場合はstd :: shared_ptrを使用して、ブーストも取り除くことができます。

補足として、参照を正しく維持でき、誰かに役立つ可能性のある、boostとstdの共有ポインターを混在させる手法があります。この質問を参照してください。他の種類の参照カウントポインタの混合にも関連する可能性があります。boost::shared_ptrからstd::shared_ptrへの変換?

私の経験では、何かを移植するときは、依存関係が少ないほど良いか、コンパイルが地獄になる可能性のある特定のプラットフォームがあります。したがって、ポインタとライブラリの相互運用性が懸念される場合は、移植性に基づいて選択してください。

于 2013-03-30T05:32:08.797 に答える