【问题标题】:OpenCV C++ memory leak issueOpenCV C++ 内存泄漏问题
【发布时间】:2022-11-10 00:16:38
【问题描述】:

只需查看以下代码 sn-p -

# include "opencv4/opencv2/opencv.hpp"
# include "iostream"
int main() {
    while (true) {
        cv::Mat* mat = new cv::Mat(2000, 2000, CV_8UC3);
        std::cout << "mat size" << mat->size() << std::endl;
        mat->release();
        std::cout << "mat size after" << mat->size() << std::endl;
    }
}

运行后的问题是 - ram 不断填充。 我有 48 GB 的内存,在循环运行的几分钟内就被填满了。

如果我要释放内存,那么为什么它会不断获取我的内存。

【问题讨论】:

  • 为什么使用new?只有cv::Mat mat(2000, 2000, CV_8UC3); 没有mat-&gt;release(); 应该没问题。每个new 必须后跟delete,并且您的代码中没有。您很少需要在现代 C++ 中直接使用new/delete。如果你认为你需要它,请先重新考虑它。
  • 是的,得到了​​你.. ;)

标签: c++ opencv memory-leaks


【解决方案1】:

cv::Mat 对象包含元数据(宽度、高度等)和指向图像数据的指针。

正如您在链接中看到的,cv::Mat::release 方法释放了为cv::Mat 数据分配的内存(假设引用计数为 0)。
它不会为 cv::Mat 对象本身(即包含 medadata 和数据指针的类的实例)释放内存。

在您的情况下,对象是使用new 在堆上分配的,因此应该使用相应的delete 释放。

但是-根本不清楚您为什么使用new。您可以将堆栈上的cv::Mat 作为自动变量:

cv::Mat mat(2000, 2000, CV_8UC3);

这样,它的析构函数(和释放)将在作用域结束时自动调用。

请注意,如果您需要手动释放cv::Mat 对象指向的数据,您仍然可以使用release。在您上面的情况下,它是不需要的,因为 cv::Mat 的 destrcutor 会为您处理它。

【讨论】:

  • 是的,我明白了.. 谢谢 ;)
【解决方案2】:

通过按以下顺序延迟加载 dll,可以避免我的 MFC 应用程序中的内存泄漏问题。

opencv_core2413d.dll;opencv_highgui2413d.dll;opencv_world460d.dll

【讨论】:

    猜你喜欢
    • 2011-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-15
    • 2011-07-29
    • 1970-01-01
    • 2016-07-28
    相关资源
    最近更新 更多