c - 释放 OpenCV IplImage 会使应用程序崩溃?

标签 c memory memory-management opencv

我在释放为IplImage分配的内存时遇到问题。我在下面的应用程序中给出了类似的情况。(它反射(reflect)了我的应用程序中发生的相同错误。)

但不是行

char* originalData=loadedImage->imageData;

我从 QT QImage 类获取“originalData”。 代码在我释放“image_gray”的行崩溃。

cvReleaseImage(&img_gray); // <-- crashes

错误消息 -

OpenCV Error: Assertion failed (udata < (uchar*)ptr && ((uchar*)ptr - udata) <= (ptrdiff_t)(sizeof(void*)+16)) in fastFree, file C:\opt\OpenCV-2.2.0\modules\co e\src\alloc.cpp, line 76 terminate called after throwing an instance of 'cv::Exception' what(): C:\opt\OpenCV-2.2.0\modules\core\src\alloc.cpp:76: error: (-215) uda a < (uchar*)ptr && ((uchar*)ptr - udata) <= (ptrdiff_t)(sizeof(void*)+16) in fu ction fastFree

但是如果我使用cvReleaseImageHeader()来代替,如果工作正常但会留下内存泄漏。

请问有什么建议吗?

void test2( char *imageFileName)
{



    IplImage *loadedImage=cvLoadImage(imageFileName);

    int xsize=loadedImage->width;
    int ysize=loadedImage->height;
    int totalBytes=xsize*ysize;


    //In my application this "originalData" data comes from a QT QImage.
    char* originalData=loadedImage->imageData;
    unsigned char* datacopy = new unsigned char [totalBytes];

    memcpy(datacopy, originalData, totalBytes);

    IplImage* img_gray = cvCreateImage( cvSize(xsize, ysize), IPL_DEPTH_8U, 1 );
    IplImage* img_gray_copy = cvCreateImage( cvSize(xsize, ysize), IPL_DEPTH_8U, 1 );
    IplImage* img_edge = cvCreateImage( cvSize(xsize, ysize), IPL_DEPTH_8U, 1 );

    IplImage* img_mask = cvCreateImage(cvSize(xsize, ysize), IPL_DEPTH_8U, 1);

    cvSet(img_mask, cvScalar(255));
    cvSet(img_gray_copy, cvScalar(255));

    cvSetZero(img_mask);


    cvSetData(img_gray, datacopy, xsize);


    cvCopy(img_gray, img_gray_copy, img_mask);

    //cvThreshold(img_gray_copy, img_edge, threshold, 255, CV_THRESH_BINARY_INV);
    //cvFindContours(img_edge, storage, contours, sizeof(CvContour), CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE);




    cvReleaseImage(&img_gray); /// <--- this crashes the application
    //cvReleaseImageHeader(&img_gray); //<--- this works.but leaving a memory leak ???
    cvReleaseImage(&img_gray_copy);

    cvReleaseImage(&img_edge);
    cvReleaseImage(&img_mask);



}

最佳答案

好的,找到问题了。 我应该对 img_gray 使用 cvCreateImageHeader() 。然后手动删除分配的内存。

关于c - 释放 OpenCV IplImage 会使应用程序崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7633016/

相关文章:

c - C中与NULL的两次相等比较

c - 为什么我不能使用此代码覆盖字符串?

c++ - 可能的堆损坏(win 32, native c++)

Python 2.6 GC出现清理对象,但内存并未释放

c - 在 C 中使用信号量实现虚拟程序

python - 如何使用所有可用内存

perl - 我应该在 Perl 中逐行读取文件时主动释放内存吗?

memory-management - Swift 5 - 模拟器启动时显示白屏 - 仪器

c++ - 我怎样才能知道 C++ 类的一个实例消耗了多少内存?

c - 如何将两个十六进制数字合并为一个数字,然后将其转换为十进制。?