在执行这样一段代码时报错
void cvcompare::edge(Mat &m_Mat)
{
Mat src_gray;
src_gray.clone(m_Mat);
Mat edge;
******
m_Mat.clone(edge);
}
报错地点在m_Mat.clone(edege)
,报错内容如下:
free():invalid next size(normal)
查阅资料发现,利用clone进行Mat复制时,每次都会为目标矩阵重新分配内存,在这个函数调用时,使用的&进行引用,显然这个时候时不能重新分配地址的,因此使用clone就会报错。
而之所以没在src_gray.clone(m_Mat)
,则是因为这是一个刚创建的Mat型数值,值还为空。
正确的做法是使用copyTo就不会报错了,copyTo不会为目标矩阵重新分配内存。
改成如下:
void cvcompare::edge(Mat &m_Mat)
{
Mat src_gray;
src_gray.clone(m_Mat);
Mat edge;
******
edge.copyTo(m_Mat);
}