2012-12-19 16 views
7

私はOpenCVライブラリの機能の大部分に依存している拡張画像処理プロジェクトを持っていますが、私はいくつかの追加機能も使用しています。OpenCVまたはBoostスマートポインタ

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

私はブーストポインタのそれぞれとの間の異なるを説明questionsnumberがあり実現が、私は誰かがcv::Ptrは彼らとの比較についての説明を提供し、どちらか一方のいずれかの提言を行うことができ望みましたか?

編集 - 私はOpenCV docsから気づきましたPtrはブーストshared_ptrと似ていますが、ライブラリ/インクルードファイルが必要なのは本質的な違いですか?

+3

標準のスマートポインタ(C++ 11にアクセスできる場合)を使用することを検討しましたか? – undu

+0

C++ 11を使用している場合は 'std :: shared_ptr'で+1してください。それ以外の場合は、すでにブーストを使用しているのか、ブーストを使用しているのか、またはブーストを使用しているものと相互運用するのかが本当に分かります。 'cv :: Ptr'は十分に機能するので、' shared_ptr'のためだけにboostを含む価値はないと思います。 – yiding

+2

あなたが使用しているのは、あなたが呼び出しているAPIに依存することになります。スマートポインタの3つの味は、必ずしも互換性があるとは限りません。 ブーストライブラリの他の部分を使うときは、 'std :: shared_ptr'の代わりに' boost :: shared_ptr'を使うのが良い理由がよくあります。同じことがOpenCVにも当てはまるだろう。 – marko

答えて

7

私はOpenCVのドキュメントで見ることができますが、これは参考カウントのスマートポインタです。boost::shared_ptrと本質的に同じです。参照カウントでも原子操作を使用します。

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

  1. は、他の場所に移植されようとしてあなたのシステムであり、確かにではなく、boostにOpenCVのに依存しますか? その後、ブーストを避けて依存関係を取り除くことができれば、OpenCV cv::Ptrに固執してください。

  2. boost::shared_ptrは他のOpenCVとうまくやっていますか? OpenCVライブラリからcv :: Ptrを返すものがあれば、両方の種類のポインタを混在させてリソースを破壊すると参照カウントが正しく処理されないため、これらの場合にはcv :: Ptrに固執する方が良いでしょう時期尚早。

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

ブーストとスタンダードの共有ポインタを組み合わせて、リファレンスを正確に保持することができ、誰かにとって便利なテクニックがあります。この質問を参照してください、他の種類の参照カウントポインタを混在させるのにも関連します:Conversion from boost::shared_ptr to std::shared_ptr?

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

+2

将来の読者のために:この答えの一部は、C++ 11で 'std :: shared_ptr'の導入によって廃止されている可能性があります:もし' boost :: shared_ptr'の代わりにそれを使うなら、もっと。しかし、残りの答えはまだ有効です! – anderas

+0

C++ 11でstd :: shared_ptrを反映させ、参照数を混ぜるように質問を更新しました。 –

関連する問題