9

我有一个扩展的图像处理项目,它的大部分功能都严重依赖于 OpenCV 库,尽管我也使用了一些增强功能。

我想开始使用智能指针来替换一些开始导致问题的原始指针。我的问题是使用哪种类型的智能指针,我的主要选择(我认为)是 OpenCVcv::Ptr或 boost 变体之一。

我意识到有许多问题可以解释每个提升指针之间的差异,但我希望有人可以解释如何cv::Ptr与它们进行比较并提出任何建议?

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

4

1 回答 1

7

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

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

  1. 您的系统是否会被移植到其他地方并且肯定依赖于 OpenCV 而不是依赖于 OpenCV boostcv::Ptr然后,如果您可以避免提升并摆脱依赖,请坚持使用 OpenCV 。

  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 共享指针的技术,可以正确地保持引用并且可能对某人有用。看到这个问题,它也可能与混合其他类型的引用计数指针有关:Conversion from boost::shared_ptr to std::shared_ptr?

以我的经验,当您移植某些东西时,依赖项越少越好,或者某些平台的编译可能是地狱。因此,如果需要考虑指针与库的互操作性,请根据可移植性做出选择。

于 2013-03-30T05:32:08.797 回答