0

以下代码根据我定义 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() 它工作正常。我能理解我做错了什么。有什么帮助吗?

4

1 回答 1

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-lengthcv::Mat对象数组一样使用。

于 2013-06-01T13:53:07.323 回答