请看下面的代码片段-
# 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的ram,在循环运行的几分钟内就被填充了。
如果我释放内存,那么为什么它一直获取我的内存。
2条答案
按热度按时间ymdaylpp1#
cv::Mat
对象包含元数据(宽度、高度等)和指向图像数据的指针。正如您在链接中所看到的,
cv::Mat::release
方法释放了为cv::Mat
数据分配的内存(假设引用计数为0)。它不会为
cv::Mat
对象本身(即包含元数据和数据指针的类的示例)释放内存。在您的示例中,对象是使用
new
在堆上分配的,因此应该使用相应的delete
释放对象。但是,我们并不清楚为什么要使用
new
,我们可以将堆栈中的cv::Mat
作为一个自动变量:这样,它的析构函数(和解除分配)将在作用域结束时自动调用。
请注意,如果需要手动释放
cv::Mat
对象指向的数据,仍然可以使用release
。在上述情况下,不需要使用release
,因为cv::Mat
的析构函数会为您处理它。flvtvl502#
我的MFC应用程序中的内存泄漏问题通过按以下顺序延迟加载dll来避免。
. dll文件中的数据。. dll文件中; opencv_world460d.dll