我有一个不断扩展的图像处理项目,它在很大程度上依赖于OpenCV库,尽管我也使用了一些增强功能。
我想开始使用智能指针来替换一些开始引起问题的原始指针。我的问题是要使用哪种类型的智能指针,我的主要选择(我认为)是OpenCV cv::Ptr
或其中一种增强变体。
我意识到number questions解释了每个加速指针之间的差异,但我希望有人可以解释cv::Ptr
与它们的比较并做出任何一个或另一个的建议?
编辑 - 我从OpenCV docs注意到Ptr
与提升shared_ptr
类似,是否需要哪些库/包含文件的重要区别?
答案 0 :(得分:7)
对于我在OpenCV文档中可以看到的内容,这是一个引用计数的智能指针,基本上与boost::shared_ptr
相同。甚至它在引用计数上使用原子操作。
我会根据可移植性和互操作性做出选择。
您的系统是否会被移植到其他地方并且肯定依赖于OpenCV而不是boost
?
然后,坚持使用OpenCV cv::Ptr
,如果你可以避免提升,你就可以摆脱依赖。
boost::shared_ptr
对OpenCV的其余部分有效吗?
如果你有一些东西从OpenCV库返回一个cv :: Ptr,也许在这些情况下坚持使用cv :: Ptr会更好,因为如果混合使用这两种指针并且资源可能会被过早销毁,则引用计数将被错误处理
无论您将项目移植到哪里,都会坚持boost
?
然后,当你能做到时,坚持boost::shared_ptr
,它更标准,人们知道它并立即理解你的代码。更新:在C ++ 11中你有std :: shared_ptr,如果你能负担得起它就没有依赖关系,所以你可以在这种情况下使用std :: shared_ptr并且也可以摆脱boost。
正如旁注,有一种技术可以混合使用boost和std共享指针,这些指针可以正确地保持引用,并且可能对某些人有用。看到这个问题,它可能也适用于混合其他类型的引用计数指针:Conversion from boost::shared_ptr to std::shared_ptr?
根据我的经验,当您移植某些东西时,依赖性越少越好,或者某些平台的编译可能是一个地狱。因此,如果它是与库的指针的关注点和互操作性,请根据可移植性做出选择。