cv::Mat 由 IplImage 和引用计数创建
cv::Mat created from IplImage and reference counting
Mat 对象使用引用计数,因此当最后一个 Mat 对象被销毁时,矩阵将被释放。如果我们从IplImage*
创建Mat
会发生什么,但是:
IplImage* img = cvLoadImage("test.png", 1);
{
Mat mtx(img); // convert IplImage* -> Mat
}
IplImage
是否也持有参考,或者一旦垫子被摧毁,它会留下一个悬空的指针?
如果您查看此处的文档,该运算符有一个copyData
参数。
Mat::Mat(const IplImage* img, bool copyData=false)
文档说明如下:
img – 指向旧式 IplImage 图像结构的指针。默认情况下,数据在原始图像和新矩阵之间共享。但是,当设置了 copyData 时,将创建图像数据的完整副本。
因此,如果您使用copyData=true
mtx
变量将拥有自己的内存,或者如果您使用copyData=false
mtx
变量将共享img
的内存。在任何一种情况下,当mtx
被销毁时img
都不会悬空,但是如果您希望它被销毁,则需要通过调用释放函数来清理它。此外,在第一种情况下,您可以在销毁mtx
之前释放img
,在后一种情况下,您不能。
注意:IplImage
中没有引用计数。
你为什么使用 IplImage?现在你应该只坚持使用 cv::Mat(没有 cv::Mat* 或 IplImage)。
此外,使用 IplImage* 会导致指针悬空,一旦您的垫子被破坏。最好使用
std::shared_ptr<cv::Mat>
或
std::unique_ptr<cv::Mat>
避免它,如果绝对必要
相关文章:
- 创建引用向量的优雅方式
- 为什么当我们有常量引用时创建临时对象?
- 在函数内创建的对象的范围 - 如果在函数外部存储和访问引用,它们是否有效?
- 如何从绝对地址的 C 样式指针创建对C++对象的引用
- 如何创建对smart_pointer的引用?
- CMake 引用我在 ~/bin 中创建的随机 shell 脚本(即使我删除了它)?
- C++在函数中创建的对 Eigen::Matrix 的悬空引用
- 如何在C++中使用 new 运算符创建对动态创建的数组的引用?
- 从引用创建指向基类的智能指针
- 通过向构造函数其他对象引用页面来创建对象
- C++为具有引用成员变量的类创建复制构造函数
- 创建<int>对整数数组指针的矢量引用 (C++)
- 哪个 const 与哪个引用将更改参数并创建一个 const 对象?
- 将非左值作为常量引用参数传递.临时是在本地作用域还是在调用方作用域中创建的?
- 为什么从引用创建共享指针会复制对象?
- 您可以使用BOOST_AUTO创建引用类型吗?
- c++在函数内部创建引用变量
- 从多个临时文件中创建引用
- 在两个语句中创建引用变量
- 创建引用和创建对象的主要区别是什么?