使用 OpenCV 2.2 ,我试图释放内存,调用发布到Mat图像 在std :: vector中,例如:
std::vector < Mat > matVec;
然而,似乎
for (int k = 0; k < matVec.size(); k++)
{
matVec[k].release();
}
没有释放任何内存(但它仍会编译)。
我知道 OpenCV 2.2 中有新的内存管理,但我无法发现 问题。
使用IplImage*
类型代替Mat(使用cvReleaseImage()
而不是Mat成员函数.release()
)的类似示例可以正常工作。
任何提示?
答案 0 :(得分:7)
.release()
只应在特殊情况下调用,而不是日常使用。只需清除矢量:
std::vector<cv::Mat>().swap(matVec);
这会调用每个Mat
的析构函数,释放内存(如果没有其他cv::Mat
指向它 - 请记住cv::Mat
,与IplImage
不同,引用计数数据类型。如果在其他地方引用它,则必须清除该引用)。如果您想保留向量,但要删除内容,请将代码中的.release()
行替换为:
matVec[k] = cv::Mat();
答案 1 :(得分:1)
最好的方法是激活每个matVec[k]
对象的析构函数。您可以通过让matVec
超出范围或将matVec
定义为vector
Mat*
并手动分配和取消分配每个对象来实现此目的。
自OpenCV使用Mat
对象的引用计数机制以来,这总是更安全,因此您不希望直接在Mat
中释放数据。