OpenCV或Boost智能指针

Chr*_*ris 7 c++ boost opencv smart-pointers image-processing

我有一个扩展的图像处理项目,它在很大程度上依赖于OpenCV库,尽管我也使用了一些boost函数.

我想开始使用智能指针来替换一些开始引起问题的原始指针.我的问题是要使用哪种类型的智能指针,我的主要选择(我认为)是OpenCV cv::Ptr或其中一种增强型.

我知道有一个数量问题,解释每个升压指针之间的不同,但我希望有人能提供怎样的解释cv::Ptr与他们比较,使一方或另一方的任何建议?

编辑 - 我从OpenCV文档中注意到Ptr类似于boost shared_ptr,是否需要哪些库/包含文件的本质区别?

Ger*_*ago 7

对于我在OpenCV文档中可以看到的内容,这是一个引用计数的智能指针,基本上与之相同boost::shared_ptr.甚至它在引用计数上使用原子操作.

我会根据可移植性和互操作性做出选择.

  1. 你的系统是否会被移植到其他地方并且肯定依赖于OpenCV而不是取决于boost?然后,坚持OpenCV,cv::Ptr如果你可以避免提升,你摆脱依赖.

  2. 确实boost::shared_ptr起到很好的与OpenCV的休息吗?如果你有一些东西从OpenCV库返回一个cv :: Ptr,也许在这些情况下坚持使用cv :: Ptr会更好,因为如果混合使用这两种指针并且资源可能会被过早销毁,则引用计数将被错误处理.

  3. 你会坚持到boost任何移植项目的地方吗?然后,坚持到boost::shared_ptr你可以做到的时候,它更标准,人们都知道它,并会立即理解你的代码.更新:在C++ 11中你有std :: shared_ptr,如果你能负担得起它就没有依赖,所以在这种情况下你可以使用std :: shared_ptr并且也可以去掉boost.

正如旁注,有一种技术可以混合使用boost和std共享指针,这些指针可以正确地保持引用,并且可以对某些人有用.看到这个问题,它可能也适用于混合其他类型的引用计数指针:从boost :: shared_ptr转换为std :: shared_ptr?

根据我的经验,当您移植某些东西时,依赖性越少越好,或者某些平台的编译可能是一个地狱.因此,如果它是指针与库的指针的关注点和互操作性,请根据可移植性做出选择.

  • 对于未来的读者:在C++ 11中引入`std :: shared_ptr`可能会废除这个答案的一部分:如果你使用它而不是`boost :: shared_ptr`,第三点不再适用.但其余的答案仍然有效! (3认同)