我在释放为 IplImage 分配的内存时遇到了问题。我给出了与我的应用程序类似的情况。(它反映了我的应用程序中出现的相同错误。)
但不是行
char* originalData=loadedImage->imageData;
我得到了我的" originalData"来自QT QImage课程。 代码崩溃在我自由的行#34; image_gray"。
cvReleaseImage(&img_gray); // <-- crashes
错误讯息 -
OpenCV错误:断言失败(udata&lt;(uchar *)ptr&amp;&amp;((uchar *)ptr - udata)&lt; =(ptrdiff_t)(sizeof(void *)+ 16))在fastFree中,文件 C:\ opt \ OpenCV-2.2.0 \ modules \ co e \ src \ alloc.cpp,第76行终止 抛出&#39; cv :: Exception&#39;的实例后调用什么(): C:\ opt \ OpenCV-2.2.0 \ modules \ core \ src \ alloc.cpp:76:错误:(-215)uda a &LT; (uchar *)ptr&amp;&amp; ((uchar *)ptr - udata)&lt; = 函数fastFree中的(ptrdiff_t)(sizeof(void *)+ 16)
但是,如果我使用 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);
}
答案 0 :(得分:0)
好的发现了这个问题。 我应该为 img_gray 使用 cv CreateImageHeader()。然后手动删除已分配的内存。