使用 OpenCV (2.4.5) 时出现内存异常

Posted

技术标签:

【中文标题】使用 OpenCV (2.4.5) 时出现内存异常【英文标题】:Memory exception while using OpenCV (2.4.5) 【发布时间】:2013-06-26 18:40:58 【问题描述】:

这是我的程序。这真的很容易。我正在尝试运行 10,000 次迭代,但在第 838 次迭代之后,我总是收到以下消息:

OpenCV 错误:内存不足 in unknown function。

为什么会抛出这个内存异常?

#include "stdafx.h"
#include "cv.h" 
#include "opencv2\core\core.hpp"
#include "opencv2\highgui\highgui.hpp"

int _tmain(int argc, _TCHAR* argv[])

    for(int i = 0;i<100000;i++)
    
        CvMat *mat = cvCreateMat(640*480,5,CV_64FC1);
        CvMat *mat_ = cvCreateMat(640*480,1,CV_64FC1);

        cvGetCol(mat,mat_,1);
        printf("%d th iteration \n",i);

        cvReleaseMat(&mat_);
        cvReleaseMat(&mat);
    
return 0;

【问题讨论】:

【参考方案1】:

您的问题是内存泄漏。行:

CvMat *mat_ = cvCreateMat(640*480,1,CV_64FC1);

为具有指定维度的CvMat 分配内存。当您将该指针传递给cvGetCol() 时,指针将更改为指向mat 中的指定列。但是,您之前分配的内存永远不会被释放,从而导致内存泄漏。

要解决此问题,请更改行:

CvMat *mat_ = cvCreateMat(640*480,1,CV_64FC1);

到以下:

CvMat temp;
CvMat* mat_ = &temp;

这应该可以解决您的内存泄漏问题。但是,如果可能的话,我强烈建议您改用 C++ API(使用 cv::Mat)。 C API 已弃用,C++ API 更易于使用并提供自动内存管理。

【讨论】:

以上是关于使用 OpenCV (2.4.5) 时出现内存异常的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV:使用 cvWriteFrame 从网络摄像头写入视频时出现内存泄漏

使用 EPPlus 库从 SQL Server 导出到 Excel 时出现“内存不足”异常

使用 Android-Espresso 运行多个测试时出现内存不足异常

为啥在比较列表项时出现内存不足异常?

为啥我在删除 char* 时出现内存异常

OpenCV 2.4.5 和 Qt5 错误:S