释放std::vector内部的Mat
Release Mat inside std::vector
使用OpenCV 2.2,我试图通过调用Mat映像的release来释放内存在std::矢量内部,例如:
std::vector < Mat > matVec;
然而,它看起来像
for (int k = 0; k < matVec.size(); k++)
{
matVec[k].release();
}
没有释放任何内存(不过它仍在编译)。
我知道OpenCV 2.2中有新的内存管理,但我无法发现问题
使用IplImage*
类型代替Mat(使用cvReleaseImage()
代替Mat成员函数.release()
)的类似示例也可以正常工作。
有什么提示吗?
.release()
只能在特殊情况下调用,不适用于日常使用。只需清除矢量:
std::vector<cv::Mat>().swap(matVec);
这会调用每个Mat
的析构函数,释放内存(如果没有其他cv::Mat
指向它,请记住,与IplImage
不同,cv::Mat
是一个引用计数的数据类型。如果它在其他地方被引用,您也必须清除该引用)。如果您想保留矢量,但要去掉内容,请将代码中的.release()
行替换为:
matVec[k] = cv::Mat();
最好的方法是激活每个matVec[k]
对象的析构函数。您可以让matVec
脱离范围,或者将matVec
定义为Mat*
的vector
,然后手动分配和解除分配每个对象。
这总是更安全的,因为OpenCV对Mat
对象使用引用计数机制,因此您不想直接解除分配Mat
中的数据。
相关文章:
- Difference in displaying cv2 Mat
- 将函数类成员映射到类本身内部
- Boost Spirit,获取迭代器内部语义动作
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 内联函数中具有内部链接的全局变量
- 在函数内部的声明中初始化数组,并在外部使用它
- 如何在不知道向量大小的情况下输入向量内部的向量?
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 卷曲bracers内部结构的声明
- 从函数角度看ID到文件路径的内部与外部映射
- spdlog标头仅与外部fmt一起使用.spdlog错误:'内部':不是'fmt'
- 如何在pugixml中获取节点的内部XML
- 使用C链接在函数内部创建C++模板
- 指针没有更新它在void函数内部指向的值
- 将CHW格式的浮点向量转换为cv::Mat
- 如何确定 cv::Mat 使用的是内部数据还是外部数据
- 如何验证rect是否在OpenCV中的cv::Mat内部
- 这样操作cv::Mat的内部缓冲区安全吗
- 如何访问函数内部Mat类型参数的变量名
- 释放std::vector内部的Mat