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
的析构函数会为您处理它。
看看下面的代码片段-
# 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
的析构函数会为您处理它。