以下代码根据我如何定义newImagesData给出了seg.fault(参见下面的注释)。如果它的数组一切正常,但如果定义为指针 - 错误:(
//Mat newImagesData[FIFO_SIZE]; // Mat is a class from opencv
Mat* newImagesData;
void func1( )
{
...
newImagesData = (Mat*)malloc(FIFO_SIZE * sizeof(Mat)); //if *newImagesData
fifoInit(&newImagesFB, newImagesData, FIFO_SIZE);
...
}
void fifoInit(FIFOBuffer* fifo, Mat* imageData, int size)
{
fifo->data = imageData;
fifo->end = 0;
}
void fifoWrite(FIFOBuffer* fifo, Mat* frame)
{
fifo->data[fifo->end] = *frame; // seg fault with *newImagesData ; OK with newImagesData[]
memcpy(&fifo->data[fifo->end], frame, sizeof(Mat)); // OK with *newImagesData
...
}
如果我使用memcpy()它可以正常工作。 我能理解我做错了什么。有什么帮助吗?
答案 0 :(得分:7)
您不应使用cv::Mat
动态分配malloc
个对象或数组,因为这只会为对象分配空间,但不会调用它们的构造函数(必须调用它才能实例化类型作为cv:Mat
)。相应地,free
不会调用所需的析构函数。
您应该使用new
(加上delete
),或者最好使用标准库结构,例如std::vector
(或C ++ 14中的'std::dynarray')。例如,
std::vector<cv::Mat> newImagesData(FIFO_SIZE);
std::dynarray<cv::Mat> newInagesData(FIFO_SIZE); // C++14 only
然后,您可以使用newImageData
,因为您将使用FIFO_SIZE
长度的cv::Mat
个对象数组。