OpenCV或Boost智能指针

时间:2012-12-19 11:17:07

标签: c++ image-processing boost opencv smart-pointers

我有一个不断扩展的图像处理项目,它在很大程度上依赖于OpenCV库,尽管我也使用了一些增强功能。

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

我意识到number questions解释了每个加速指针之间的差异,但我希望有人可以解释cv::Ptr与它们的比较并做出任何一个或另一个的建议?

编辑 - 我从OpenCV docs注意到Ptr与提升shared_ptr类似,是否需要哪些库/包含文件的重要区别?

1 个答案:

答案 0 :(得分: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。

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

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