我使用以下代码:
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main(int argc, char* argv[])
{
const string ipImgName= argv[1];
Mat ipImg;
ipImg = imread( ipImgName, 1 );
cv::Mat gcImg;
cv::Mat bgdModel;
cv::Mat fgdModel;
cv::Rect rect(0, 0, ipImg.cols-1, ipImg.rows-1);
cv::grabCut( ipImg, gcImg, rect, bgdModel, fgdModel, 1, cv::GC_INIT_WITH_RECT );
return 0;
}
但是当退出主循环时,当调试器进入~Mat()
析构函数时,代码在release()
上崩溃(说“这可能是由于堆的损坏”)gcImg或bgdModel或者fgdModel。
但是,如果我使用cv::Mat
在堆上分配new
,然后在之后不删除它们,则代码运行正常。我正在使用Visual Studio 2010和OpenCV 2.3.1。
答案 0 :(得分:0)
如果您正在运行与Release libs链接的Debug版本,那么由于使用了不同的内存分配例程,可以报告此虚假“错误”。
在Debug版本中,内存分配在分配块的任一端使用保护字节进行保护,并执行各种检查以防止损坏,泄漏等。在Release版本中,不会执行这些检查,并且当您混合使用Debug和Release代码时,分配了一个的内存被另一个释放,这是您看到的典型错误。
这实际上并不是一个真正的错误,只是混合不同运行时的副作用。 MSDN has more details