OpenCV C++ 内存泄漏问题

OpenCV C++ memory leak issue

看看下面的代码片段-

# 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 的内存,在循环运行的几分钟内就被填满了。

如果我正在释放内存,那为什么它一直在获取我的内存。

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

正如您在 link 中看到的那样,cv::Mat::release 方法释放了为 cv::Mat 数据分配的内存(假设 ref-count 为 0)。
它不会释放 cv::Mat 对象本身的内存(即包含元数据和数据指针的 class 的实例)。

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

释放

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

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

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

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