我正在使用 OpenCV,我想Mat
在一个向量中存储许多图像(对象)。我已将向量声明如下以存储指向Mat
对象的指针。
std::vector<Mat*> images;
Mat
对象是使用关键字创建的,new
然后添加到向量中。
Mat *img = new Mat(height, width, CV_8UC3);
// set the values for the pixels here
images.push_back(img);
我将如何确保释放Mat
对象占用的内存以避免内存泄漏?
我现在正在做的事情如下:
Mat *im = images.at(index);
// process and display image here
delete(im);
Valgrind 正在报告参考创建的 Mat 对象可能存在的内存泄漏。我错过了什么吗?
编辑:
好的。显然最好避免使用Mat
指针和动态分配Mat
using new
。我已经修改了我的代码以使用std::vector<Mat>
。但是,我仍然在 Valgrind 报告中看到一些Mat
可能丢失的块。我还注意到程序运行时内存使用量稳步增加。
让我澄清一下我在做什么。我在函数中创建图像并将它们放在缓冲区中(内部使用 a std::deque
)。这个缓冲区然后被另一个函数访问以检索和图像并将其传递给另一个执行处理和渲染的函数。
class Render {
public:
void setImage(Mat& img) {
this->image = img;
}
void render() {
// process image and render here
}
private:
Mat image;
}
连续从缓冲区获取图像并渲染它们的线程。
void* process(void *opaque) {
ImageProcessor *imgProc = (ImageProcessor*) opaque;
Mat img;
while (imgProc->isRunning) {
// get an image from the buffer
imgProc->buffer->getFront(img);
// set the image
imgProc->renderer->setImage(img);
// process and render
imgProc->renderer->render();
}
}
现在,所有内容都作为对象引用传递(即Mat&
)。我假设从缓冲区获取图像并将其传递给渲染函数后,对该对象的唯一引用将在该函数中。因此,当我得到另一个图像时,将不再有对该对象的引用,它将被销毁。但是 Valgrind 给了我以下信息:
25,952,564 bytes in 11 blocks are possibly lost in loss record 14,852 of 14,853
in ImageProcessor::generateImage() in ImageProcessor.cpp:393
1: malloc in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so
2: cv::fastMalloc(unsigned long) in /usr/local/lib/libopencv_core.so.2.4.2
3: cv::Mat::create(int, int const*, int) in /usr/local/lib/libopencv_core.so.2.4.2
4: cv::Mat::create(int, int, int) in /usr/local/include/opencv2/core/mat.hpp:353
5: cv::Mat::Mat(int, int, int) in /usr/local/include/opencv2/core/mat.hpp:75
...
这是generateImage()
:
void generateImage() {
Mat img(h, w, CV_8UC3);
// set values of pixels here
this->buffer->pushBack(img);
}