为啥 OpenCV Mat 会造成内存泄漏?
Posted
技术标签:
【中文标题】为啥 OpenCV Mat 会造成内存泄漏?【英文标题】:Why OpenCV Mat creates memory leaks?为什么 OpenCV Mat 会造成内存泄漏? 【发布时间】:2019-01-28 11:39:13 【问题描述】:不确定这是否相关,但我在我的项目中使用opencv4nodejs
,并且我确实在这种情况下运行,如果我不在每个 Mat 对象上调用.release()
,内存消耗就会增加~ 10MB/秒。
这个简单的示例代码将解决问题。
function loop(camera, display)
let mat = camera.read();
let grey_mat = mat.bgrToGray();
loop(camera, display);
因为,这个解决了问题:
function loop(camera, display)
let mat = camera.read();
let grey_mat = mat.bgrToGray();
grey_mat.release();
mat.release();
loop(camera, display);
如果我搜索 OpenCV Mat 对象导致泄漏的原因,我会得到答案,人们说 Mat 能够自行处理内存使用。
如果最后一句话是真的,我做错了什么?如果我没有做错任何事,为什么我必须明确告诉 Mat 对象释放它的内存?或者,npm 模块opencv4nodejs
本身是否存在潜在问题?
【问题讨论】:
【参考方案1】:那是因为您使用的是recursion
。在函数结束时,您再次调用loop
,因此它会在每次递归时堆叠这些Mat
的新实例。对象 mat 和 gray_mat 永远不会被销毁,如果您要从函数很难返回,它们会被销毁。
如果您更改 iterative
的循环,您应该不会再遇到问题,因为函数每次都会返回并且垫子会被破坏。
function doLoopWork(camera, display)
let mat = camera.read();
let grey_mat = mat.bgrToGray();
function loop(camera, display)
while (1)
doLoopWork(camera, display);
【讨论】:
以上是关于为啥 OpenCV Mat 会造成内存泄漏?的主要内容,如果未能解决你的问题,请参考以下文章
opencv学习笔记详解基本图像容器Mat以及常用数据结构和函数
OpenCV cv::Mat 使用 std::vector 导致潜在的内存泄漏